`
allwefantasy
  • 浏览: 46843 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

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语言静态变量和静态方法的分析及其应用研究.pdf

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    - **访问限制**:静态方法只能访问静态成员变量和静态方法,无法直接访问非静态成员变量和方法。 - **不参与多态**:静态方法不受多态的影响,即使在子类中重写了父类的静态方法,调用时仍然根据声明类型来决定执行...

    java-静态变量方法块

    在Java编程语言中,静态变量、静态方法、静态代码块以及非静态变量和非静态方法是核心概念,它们对于理解和编写Java程序至关重要。下面将详细解释这些概念,并通过实例程序来阐述它们的使用和内存管理。 首先,静态...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    在Java编程语言中,了解和区分不同类型的变量和方法是至关重要的。这关系到程序的结构、内存管理和代码的可维护性。以下是关于Java成员变量、局部变量、静态变量以及成员方法和全局方法的基本概念和区别的详细阐述。...

    java中静态与非静态的变量定义与使用

    在Java编程语言中,变量可以被声明为静态或非静态,这两种类型的变量有着显著的区别,对程序的行为产生重要影响。让我们深入探讨一下静态与非静态变量的定义与使用。 首先,静态变量是属于类级别的,这意味着它们是...

    Java语言中变量和方法的分析及其应用.pdf

    本文通过详细分类说明了变量和方法的概念,并分析了变量和方法在Java程序设计应用过程中的内存分配问题、在继承时的覆盖问题以及静态变量和静态方法的应用问题。同时,本文也给出了部分典型案例,希望能为Java程序...

    static静态变量使用@Value注入方式.md

    这种方法不仅避免了潜在的警告和错误,还保持了静态变量的功能,确保了代码的健壮性和灵活性。 总之,理解`@Value`注解的工作原理以及如何正确地使用它对于编写高质量的Spring应用程序至关重要。希望本文能够帮助...

    static 静态变量加载

    statilocal java 静态变量和静态块加载顺序,静态变量和同名静态变量块加载的顺序。

    WPF绑定静态变量的示例代码

    在实际项目中,你可能需要根据需求调整静态变量的类型和更新机制,例如,如果静态变量是复杂类型,你可能需要自定义转换器或者使用`ObservableObject`来处理更改通知。 在提供的压缩包文件`WpfTestBindStaticField`...

    C# 公有变量 私有变量 静态变量

    // 不需要实例化类就能访问静态变量和方法 Console.WriteLine(MyClass.StaticVar); // 输出10 MyClass.ModifyStaticVar(); Console.WriteLine(MyClass.StaticVar); // 输出11 ``` 在实际编程中,正确选择变量的访问...

    Java中的静态变量静态方法静态块与静态类.docx

    ### Java中的静态变量、静态方法、静态块与静态类 #### 一、静态变量 静态变量,也称为类变量,是定义在类中方法之外的,并且被`static`关键字修饰的变量。这类变量并不属于类的任何实例,而是属于类本身。这意味...

    静态变量的导入以及集合的运用

    在Java编程语言中,静态变量和集合是两个非常重要的概念。本文将详细介绍如何导入静态变量,并深入探讨集合类的使用方法及其实例。 #### 一、静态变量的导入 静态变量(也称为类变量)是在类的生命周期内共享的...

    静态的魔力:Java中静态方法和变量的深度解析

    在Java中,静态(static)关键字被用来修饰类的成员变量和方法,表示这些成员属于类本身而非类的某个具体实例。这意味着: - **无需实例化即可访问**:静态成员可以在没有创建类的实例的情况下被访问。 - **所有实例...

    C#中静态变量的使用

    C# 中静态变量的使用是指在 C# 语言中使用静态变量的方法和技术。本文将详细介绍静态变量与非静态变量的区别、静态变量的使用方式、静态构造函数的使用等方面的知识点。 一、静态变量与非静态变量的区别 静态变量...

    JAVAStatic静态变量.doc

    Java中的`static`关键字是用来声明静态变量或静态方法的,它是面向对象编程中非常...理解静态变量和方法的使用是成为一名熟练的Java开发者的关键。在编写代码时,明智地使用`static`可以帮助提高程序的效率和可维护性。

    VB 静态变量举例

    在VB(Visual Basic)编程语言中,静态变量是一种特殊的变量类型,它的值在程序执行期间不会被清除,即使函数或过程结束,静态变量仍然保留其值。这种特性使得静态变量在需要跟踪或累计数据时非常有用。下面我们将...

    springboot 使用yml配置文件给静态变量赋值教程

    由于我们有一个静态工具类`ClickHouseUtil`,其中的方法依赖于静态变量,所以我们不能直接使用`@Value`注解为静态变量赋值。Spring框架不允许在静态字段上直接注入值,因为它不支持实例化静态对象。 为了解决这个...

    java 利用反射获取内部类静态成员变量的值操作.docx

    ### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...

Global site tag (gtag.js) - Google Analytics