继承子类中的Java公共/受保护变量值为Null

时间:2015-10-05 03:38:10

标签: java

我想从子类。

访问在超类中声明受保护的变量

值在子类中显示null,但它在超类中正确显示。如果超类变量是静态的,它可以工作,但是循环值没有被正确采用。

我的代码:

public class App {
    public String var ;

    public static void main(String[] args) {    
        App ap = new App();
        ap.fromt();
    }

    public void fromt() {
        Sub s = new Sub();
        for(int i = 0; i <= 5; i++) {
            var = "Test" + i;
            System.out.println("Hello World!" + var);
            s.testtt();
        }
    }
}

//**Inherited Class**//
public class Sub extends App {
    public void testtt() {
        String var2 = super.var;
        System.out.println("Hello World! Subclass" + var2);
    }
}

输出:

Hello World!Test0
Hello World! Subclassnull
Hello World!Test1
Hello World! Subclassnull
Hello World!Test2
Hello World! Subclassnull
Hello World!Test3
Hello World! Subclassnull
Hello World!Test4
Hello World! Subclassnull
Hello World!Test5
Hello World! Subclassnull

2 个答案:

答案 0 :(得分:1)

SubApp确实获得了超类中定义的成员变量var的副本。 它们是两个不同的副本。 对其中一个副本所做的任何更改将保持对另一个副本的互斥。当使用静态成员时,事情会发生变化。在实例化类时,不应混淆继承中的成员数据共享。

要回答您的疑问,String var未在任何地方初始化,因此默认情况下假设为空值。如果在声明或在超类App的构造函数中初始化它,则该值也将反映在Sub的实例中。

答案 1 :(得分:0)

你在这里处理范围问题。您有正在运行的App实例,并且在该实例中,您正在运行循环并在此特定实例中设置变量的值。然后,您将创建一个Sub实例,该实例当前在其自身内部维护自己的var实例。

现在,如果你想在所有App / Sub实例中共享var的单个实例,那么你就可以实现:

public static String var ;

我假设这是一个家庭作业,所以我不会讨论这个的优点和缺点,但只要知道静态变量是你真正需要考虑的任何类型的应用程序之一。