Java 语言静态变量和静态方法继承机制的吐槽

上一篇 / 下一篇  2012-10-26 10:30:38 / 个人分类:Java

51Testing软件测试网 R a Nm9M'f,Ls

  假设,如果,要是,'静态变量'的继承能够按照我‘天真的以为是的那个样子’,会怎么样呢?51Testing软件测试网 Gj-S1IsM)eF&J

51Testing软件测试网&fa,k#yj7m

class Person {
sv-SW#Mn4w%}TV0    public static String name = "person";
P,P)Oyk ox8A0    public static String name(){51Testing软件测试网 xV!ys|
         return name;
+Z/{C&UnG }p%|7I0    }
51Testing软件测试网*]s0T}8Z!|~ B(DZ

O h,[t3cqz0}51Testing软件测试网Z*_y'Z lbBY'I

51Testing软件测试网~rT-C'T'Y

class Person2 extends Person {51Testing软件测试网r)Ap(ej|
}

[5g%V)x3{E0

n*e@ \l0class Person3 extends Person {

V+Az+F,g4KZ+gUj0

sp0[u(j0}51Testing软件测试网ur3j$P;z y%l

51Testing软件测试网5sy@9u*Pn

  Person2 和 Person3 都继承自Person。51Testing软件测试网7KsRJMH0f

51Testing软件测试网s,_!Ju7yKw1`7\r3b

  接着我希望如此:51Testing软件测试网4S^"c$|0}c$w

51Testing软件测试网;h,\0c%f4xG

public class Test {51Testing软件测试网&P:{{iKesb/p#X
    public static void main(String[] args) {
)NPP/K9X#DZR4T0        Person2.name = "person2";
I_ VYBi'R0        Person3.name = "person3"

B;F6qp[ds7}Z051Testing软件测试网c}H:nb H0NgAz

        Person.name();//希望能打印出 "person"51Testing软件测试网Km8T h2j(c m*f#q
        Person2.name();//希望能打印出 "person2"51Testing软件测试网DN.Uw7DQHE;NP$t5j
        Person3.name();//希望能打印出 "person3"
51Testing软件测试网S%WA_;O2X _b

i#B.fj,uz;P0    }

.S'X}O#dI051Testing软件测试网L/f#zkz2q-x

51Testing软件测试网-Vz qqN y;IT F!J w
}

SeP:p+_^0

"Vx h/V jxMi0  但是最后都打印了出person3.总结一句:

#Cy(L$n3Y]!KJ$a0

+xdDG)O9X0  静态变量和静态方法是完全特定属于某个类的。继承自父类的类访问到的静态变量也是它父亲的。你可以申明自己的静态变量覆盖父类的静态变量,但是如果你用的是继承自父类的静态方法获取静态变量,你最终得到的也是父类的静态变量。51Testing软件测试网DG*}-@|D

51Testing软件测试网1Q]XFvgyr

  这是完全操蛋的设计!!!51Testing软件测试网(T0\zg)w$N n

51Testing软件测试网dV^ gM-vw#ih

  继承就应该是继承到父类的一份copy!

T|Dn} GD051Testing软件测试网4VIa9II1w*F

  为什么我强烈的希望继承的是copy 而不是一个简单引用呢?

^'atR+\]0

Vwl&d,v d0  因为它让java的某种申明式语法成为不可能。51Testing软件测试网XE-L$?MZ_@

;k0| Y}ysF kX;RX0  下面全部是基于静态变量和方法继承后在子类会获得一份新的copy的假设而成立的(这实际上是不被支持的),千万不要以为下面的例子是正确的

+A)HK!F?:P'c0

eT\?u0w0  举个例子,我在设计一个模型类的时候:51Testing软件测试网DQ gH4P+`4fU

51Testing软件测试网M6`"n"i!t:EY$A]g

public class Document {
E+Y{(]\0  protected static String storeIn = "";
z0r!Q;C`0  public static void storeIn(String name){
-XjB&D q*{*n P0     storeIn = name;
-qT$}&|4V l0  }

}1JS*zTK0

k2]FP4\:JI)QA0  public static String storeIn(){51Testing软件测试网VWPg*D%Ru {,\)H/U#TK
      return storeIn;51Testing软件测试网B3U ?RW%o*j0p-j ud
  }
.FJ)U~ v*AwF3C+P0  …….
A |U6@|0}

U c;oC3cd+Yd051Testing软件测试网@7L D,nVtQW

public class Person extends Document {
hr @U4N'A[`&u&}0    static {
JHa-Ja)]0        storeIn("persons");
ng*k`Oh{0        hasMany("addresses", new Options(map(
X SM6l5D0                Options.n_kclass, Address.class,51Testing软件测试网1tI[_;S){I#{%R
                Options.n_foreignKey, "person_id"51Testing软件测试网VD5gP5p$Gjt _ZE
        )));
4O"ZU7L e0    }51Testing软件测试网;cSx r7U
}

i9[A(N/?7k}051Testing软件测试网!@/X Z0b8\*e }q0l'O,U

  每个子类可以通过静态变量存储的自己的配置信息。通过继承自父类从而避免每次去申明这些静态变量和方法。看出端倪了吗?静态变量完全可以作为一 个类似Annotation的东西,并且会比Annotation更简单。Annotation是啥,就是对某个类(域,方法等)进行注解,对吗?51Testing软件测试网.K-N R.T.F V4YI%DQ

51Testing软件测试网7oW+[/T Je!U5J

  上面Person的写法完全等价于:51Testing软件测试网Pp#}{7eT6qjA

5W%\#r ]J0

r-a+j&I&@8D2pmB0Q0
@StoreIn("persons")
^3\*j6U2h?US0public class Person extends Document {51Testing软件测试网-_,{:y7C+CrQ8s
    @HasMany(Options.n_kclass=Address.class)51Testing软件测试网K(U*W5pa @L
    private List addresses;
S Q(L9J!F+ibFYH0    .....
5VJ+Cm9v`;s0}

3U%z'fDXnN0  第一眼感觉上都差不多。但是Annotation存在诸多限制,比如里面不能存复杂类型的信息。而且一旦写了,就写死啦,就不能改啦。那如果使用静态变量呢?

7kX-u _j x7qQ0

q lf:n:Pt#q0  我要那storeIn的信息怎么拿?

&P:Q]` u0

Pme!Fo051Testing软件测试网j(rm0sq y1l qE

'I,x X.C8vw H"_0Person.storeIn();

*V F6?r1vO051Testing软件测试网DT.q%M k

//annotation的拿法
r`%WZv b/T0Person.getClass.getAnnotations()
5y%P*i,J.}0[0Kw9?0....blablalba...好多。
51Testing软件测试网)L"o{:XM0I Z:gQs

51Testing软件测试网 _k1E;D_Hh Xk.n

  然后程序在运行的时候完全可以修改静态变量的值。如果你觉得不安全,你还可以通过final 进行限制。

6O3^t@jbd7a0

)lC{1B'l0  其实刚才说了那么多,还有一个点子没说到,就是,静态变量都是继承自父类的,你没必要在子类像Annotation一个一个去写。对一个类的注解信息你完全就像调用一个简单的方法进行设置。多爽。51Testing软件测试网i#Iy5yf a

3~9E3Umt3G%B$a2E.K0  但是现在因为刚才我说的Java糟糕的静态继承设计,使得这成为不可能。不然,还需要Annotation吗?需要!但完全可以只作为静态变量的一个补充。51Testing软件测试网K$gAoQ*USs }


TAG:

 

评分:0

我来说两句

Open Toolbar