假设,如果,要是,'静态变量'的继承能够按照我‘天真的以为是的那个样子’,会怎么样呢?
class Person {
public static String name = "person";
public static String name(){
return name;
}
}
class Person2 extends Person {
}
class Person3 extends Person {
}
Person2 和 Person3 都继承自Person.
接着我希望如此:
public class Test {
public static void main(String[] args) {
Person2.name = "person2";
Person3.name = "person3"
Person.name();//希望能打印出 "person"
Person2.name();//希望能打印出 "person2"
Person3.name();//希望能打印出 "person3"
}
}
但是最后都打印了出person3.总结一句:
静态变量和静态方法是完全特定属于某个类的。继承自父类的类访问到的静态变量也是它父亲的。你可以申明自己的静态变量覆盖父类的静态变量,但是如果你用的是继承自父类的静态方法获取静态变量,你最终得到的也是父类的静态变量。
这是完全操蛋的设计!!!
继承就应该是继承到父类的一份copy!
为什么我强烈的希望继承的是copy 而不是一个简单引用呢?
因为它让java的某种申明式语法成为不可能。
下面全部是基于静态变量和方法继承后在子类会获得一份新的copy的假设而成立的(这实际上是不被支持的),千万不要以为下面的例子是正确的
举个例子,我在设计一个模型类的时候:
public class Document {
protected static String storeIn = "";
public static void storeIn(String name){
storeIn = name;
}
public static String storeIn(){
return storeIn;
}
…….
}
public class Person extends Document {
static {
storeIn("persons");
hasMany("addresses", new Options(map(
Options.n_kclass, Address.class,
Options.n_foreignKey, "person_id"
)));
}
}
每个子类可以通过静态变量存储的自己的配置信息。通过继承自父类从而避免每次去申明这些静态变量和方法。 看出端倪了吗?静态变量完全可以作为一个类似Annotation的东西,并且会比Annotation更简单。Annotation是啥,就是对某个类(域,方法等)进行注解,对吗?
上面Person的写法完全等价于:
@StoreIn("persons")
public class Person extends Document {
@HasMany(Options.n_kclass=Address.class)
private List addresses;
.....
}
第一眼感觉上都差不多。但是Annotation存在诸多限制,比如里面不能存复杂类型的信息。而且一旦写了,就写死啦,就不能改啦。 那如果使用静态变量呢?
我要那storeIn的信息怎么拿?
Person.storeIn();
//annotation的拿法
Person.getClass.getAnnotations()
....blablalba...好多。
然后程序在运行的时候完全可以修改静态变量的值。如果你觉得不安全,你还可以通过final 进行限制。
其实刚才说了那么多,还有一个点子没说到,就是,静态变量都是继承自父类的,你没必要在子类像Annotation一个一个去写。对一个类的注解信息你完全就像调用一个简单的方法进行设置。多爽。
但是现在因为刚才我说的Java糟糕的静态继承设计,使得这成为不可能。不然,还需要Annotation吗?需要!但完全可以只作为静态变量的一个补充。
分享到:
相关推荐
JAVA语言静态变量和静态方法的分析及其应用研究.pdf
Java中的静态变量静态方法静态块与静态类.docx
java之中的静态变量与静态方法的继承与覆盖问题.doc
statilocal java 静态变量和静态块加载顺序,静态变量和同名静态变量块加载的顺序。
Java成员变量局部变量静态变量成员方法全局方法等概念的区别共3页.pdf.zip
用c++的类实现,对于c++初学者帮助较大,主要熟悉静态变量 静态方法的使用 将练习与数据结构相结合
MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值
静态变量和非静态变量的区别
在Java中定义变量时需要慎重考虑是静态还是非静态,因为静态拥有绝对优先权!
C_语言静态变量和静态函数,可以让您对C语言静态变量和静态函数有更清晰的认识
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
我们知道类的生命周期分为装载、连接、初始化、使用和卸载的五个过程。 其中静态代码在类的初始化阶段被初始化。而非静态代码则在类的使用阶段(也是实例化一个类的时候)才会被初始化。 静态变量 可以...
block,局部变量,全部变量,static的静态变量关系
JAVAStatic静态变量.doc
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
静态变量的导入以及集合的运用,以及综合实例。
VB 静态变量举例 VB 静态变量举例 VB 静态变量举例
java静态变量与方法.doc
变量和方法覆盖和隐藏的不同:一个类的实例无法通过使用全局名或者强制自己转换为父类型,以访问父类中被隐藏的方法,然而强制转换子类为父类型之后,可以访问父类中被隐藏的变量。另外静态方法不能覆盖父类的实例...