当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2012-10-23   作者:allwefantasy   来源:转载   浏览次数:
摘要: 假设,如果,要是,'静态变量'的继承能够按照我‘天真的以为是的那个样子’,会怎么样呢? class Person { public static String name = "person"; public static String name(){ return name; } } class Person

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

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 语言静态变量和静态方法继承机制的吐槽

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、class object、class variable 首先class在python里面是一个对象,它有独立区域存储属于自己的
public class StaticVariable { public static void main(String[] args) { Person p1 = new Person
在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?
今天周一,昨天没有上课,所以今天又回来啦,今天学习啦知识点不碎,就是首先学习了StringBuilder
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static
1、主要流程 1、 新建一个测试类TestProvider.java a) 该类提供了2个方法 b) 一个静态的方法,一个非
#include <iostream> using namespace std; int main() { int * np; int i = 2; while(i--) {
apple server 检测的token 有问题 (如下图) 如图显示, 我在每1000 个消息的时候 发送一个错误的t
apple server 检测的token 有问题 (如下图) 如图显示, 我在每1000 个消息的时候 发送一个错误的t
apple server 检测的token 有问题 (如下图) 如图显示, 我在每1000 个消息的时候 发送一个错误的t
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号