我想从子类。
访问在超类中声明受保护的变量值在子类中显示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
答案 0 :(得分:1)
类Sub
和App
确实获得了超类中定义的成员变量var
的副本。
它们是两个不同的副本。
对其中一个副本所做的任何更改将保持对另一个副本的互斥。当使用静态成员时,事情会发生变化。在实例化类时,不应混淆继承中的成员数据共享。
要回答您的疑问,String var
未在任何地方初始化,因此默认情况下假设为空值。如果在声明或在超类App
的构造函数中初始化它,则该值也将反映在Sub
的实例中。
答案 1 :(得分:0)
你在这里处理范围问题。您有正在运行的App实例,并且在该实例中,您正在运行循环并在此特定实例中设置变量的值。然后,您将创建一个Sub实例,该实例当前在其自身内部维护自己的var实例。
现在,如果你想在所有App / Sub实例中共享var的单个实例,那么你就可以实现:
public static String var ;
我假设这是一个家庭作业,所以我不会讨论这个的优点和缺点,但只要知道静态变量是你真正需要考虑的任何类型的应用程序之一。