关闭

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

发表于:2012-10-25 09:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:allwefantasy    来源:51Testing软件测试网采编

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

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"
        )));
    }
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号