Chinaunix首页 | 论坛 | 博客
  • 博客访问: 756579
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: Java

2012-10-23 16:55:34

假设,如果,要是,'静态变量'的继承能够按照我‘天真的以为是的那个样子’,会怎么样呢?

  1. class Person {  
  2.     public static String name = "person";  
  3.     public static String name(){  
  4.          return name;  
  5.     }  
  6.   
  7. }  
  8.   
  9. class Person2 extends Person {  
  10. }  
  11.   
  12. class Person3 extends Person {  
  13.   
  14. }  

Person2 和 Person3 都继承自Person.

接着我希望如此:

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Person2.name = "person2";  
  4.         Person3.name = "person3"  
  5.   
  6.         Person.name();//希望能打印出 "person"  
  7.         Person2.name();//希望能打印出 "person2"  
  8.         Person3.name();//希望能打印出 "person3"  
  9.   
  10.     }  
  11.   
  12.   
  13. }  

但是最后都打印了出person3.总结一句:

静态变量和静态方法是完全特定属于某个类的。继承自父类的类访问到的静态变量也是它父亲的。你可以申明自己的静态变量覆盖父类的静态变量,但是如果你用的是继承自父类的静态方法获取静态变量,你最终得到的也是父类的静态变量。

这是完全操蛋的设计!!!

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

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

因为它让java的某种申明式语法成为不可能。

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

举个例子,我在设计一个模型类的时候:

  1. public class Document {  
  2.   protected static String storeIn = "";  
  3.   public static void storeIn(String name){  
  4.      storeIn = name;  
  5.   }  
  6.   
  7.   public static String storeIn(){  
  8.       return storeIn;  
  9.   }  
  10.   …….  
  11. }  
  12.   
  13. public class Person extends Document {  
  14.     static {  
  15.         storeIn("persons");  
  16.         hasMany("addresses"new Options(map(  
  17.                 Options.n_kclass, Address.class,  
  18.                 Options.n_foreignKey, "person_id"  
  19.         )));  
  20.     }  
  21. }  

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

上面Person的写法完全等价于:

  1. @StoreIn("persons")  
  2. public class Person extends Document {  
  3.     @HasMany(Options.n_kclass=Address.class)  
  4.     private List addresses;  
  5.     .....  
  6. }  

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

我要那storeIn的信息怎么拿?

  1. Person.storeIn();  
  2.   
  3. //annotation的拿法  
  4. Person.getClass.getAnnotations()  
  5. ....blablalba...好多。  

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

其实刚才说了那么多,还有一个点子没说到,就是,静态变量都是继承自父类的,你没必要在子类像Annotation一个一个去写。对一个类的注解信息你完全就像调用一个简单的方法进行设置。多爽。

但是现在因为刚才我说的Java糟糕的静态继承设计,使得这成为不可能。不然,还需要Annotation吗?需要!但完全可以只作为静态变量的一个补充。


阅读(1318) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~