【问题标题】:Does overriding a static variable defined from a sub-class influence the value of said variable in parent class?覆盖从子类定义的静态变量是否会影响父类中所述变量的值?
【发布时间】:2017-04-22 15:32:25
【问题描述】:

我带着一个简单的 OOP 问题来找你。 假设有三个类 - A、B 和 C。 B 和 C 都从 A 继承了一个静态变量。假设 A 将该变量的值定义为 0。 假设 B 和 C 都修改了这个静态变量的值。 我的问题是——由于静态变量在同一个类的成员之间保持不变,这是否意味着从子类设置超类变量的值不会影响超类的值?

换句话说,如果我们将 B 的变量的值更改为 1,那么对于 B 类而不是 C 或 A 的对象,该值将仅为 1?

【问题讨论】:

  • 为什么不测试一下看看呢?你认为应该发生什么?是什么让你这么认为?
  • 无论如何,您在标题中说的是覆盖,但在您的问题中,您说“B 和 C 都修改了这个静态变量的值”,这更接近于重新分配值。也许尝试通过发布适当的代码示例来澄清那部分。
  • 你不能覆盖一个变量,更不用说一个静态变量了。您只能覆盖实例方法。

标签: java


【解决方案1】:

一个静态字段只属于一个类,不被其子类继承

【讨论】:

  • “并且不被其子类继承”是模糊的,因为子类可以继承访问这个静态字段。假设我们有class Foo{public static int x = 0;}class Bar extends Foo{}。这意味着我们仍然可以使用Bar.x 来访问在Foo 中定义的x
  • 你是对的,子类有访问权限,但是从OO的角度来看,只有一个字段,它属于超类
  • 静态字段由子类型继承,如果可访问且不是私有的。根据 JLS,“一个类从它的直接超类和直接超接口继承超类和超接口的所有非私有字段,这些字段都可以被类中的代码访问,并且不会被类中的声明隐藏。”这个答案是完全错误的。
  • 这是一个相当学术的讨论,但是从 OO 的角度来看,您(以及显然是文档)所描述的内容我不会称之为 inharetace。
【解决方案2】:

在这里您可以找到解决您问题的简单 java 实现。
结果可以解释解。

 class A {
   static int variable = 0;
}

class B extends A{

}
 class C extends A{

}

public class Runclass {

    public static void main(String arg[]){
        A a = new A();
        System.out.println("A "+a.variable);

        B b = new B();
        System.out.println("B "+b.variable);

        C c = new C();
        System.out.println("C "+c.variable);

        b.variable=1;
        System.out.println("After modifying B "+b.variable);
        System.out.println(" A "+a.variable);

    }
}

输出:

A 0
B 0
C 0
After modifying B 1
A 1

【讨论】:

    【解决方案3】:

    static 并不意味着恒定。 final 表示您无法更改该值。
    您可以访问超类 A 中的变量并更改它,例如在 B 中使用以下代码:A.someVariable=1;
    在此之后,如果您使用超类 A 变量 (A.someVariable),您还将看到 C、B 和 A 的值 1。
    我给您一个代码示例:

    package teszt;
    
    class A {
        static int statValami=0;
    }
    


    package teszt;
    
    class B extends A{
        void writeOut(){
            A.statValami=1;
            System.out.println(statValami);
        }
    }
    


    package teszt;
    
    class C extends A {
        void writeOut(){
            A.statValami=100;
            System.out.println(statValami);
        }
    }
    


    打包测试;

    class Over  {
        public static void main(String args[]){
            new B().writeOut();
            new C().writeOut();
            System.out.println(A.statValami);
        }
    }
    



    输出为:
    1
    100
    100

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多