在下面的代码中,当我运行Test2时,为什么打印null
而不是lol
?似乎config
方法修改了类a
的{{1}}属性,而不是Test
。
但是继承操纵私有属性的公共方法的意义是什么呢,为什么他们这样设计Java呢?
编辑:
不得修改类Test2
。我想要做的是重用Test
方法。我为config
定义了一个私有属性a
,但Test2
只是忽略它并使用config
的私有属性。一个方法不应该使用它所在的类的属性而不是继承的超类的属性吗?
Test
答案 0 :(得分:1)
简而言之,目的是封装。您不需要也不能访问类外部的私有内容。做你想做的事情的公认模式是getter / setter:
public abstract class Test {
public void config() {
setA("lol");
}
public abstract void setA(String value);
}
public class Test2 extends Test {
private String a;
public void setA(String value) {
a = value;
}
public void print() {
config();
System.out.println(a);
}
public static void main(String[] args) {
new Test2().print();
}
}
答案 1 :(得分:1)
似乎config方法修改了类
Test
的属性,而不是Test2
。
那是对的。
为什么打印
null
代替lol
?
您有两个具有相同名称的变量。一个在超类Test
中,另一个在子类Test2
中。两者都命名为a
,但它们指的是不同的东西。
超类中的方法config()
引用超类a
,子类中的print()
方法引用子类a
。由于变量是私有的,因此两种方法都不能在另一个类中看到变量。
为什么他们这样设计Java?
这是private
的性质。没有人能看到它。
在我看来,你实际上想要protected
变量的行为:
public class Test {
protected String a;
public void config() {
a = "lol"
}
}
public class Test2 extends Test {
public void print() {
config();
System.out.println(a);
}
public static void main(String[] args) {
new Test2().print();
}
}
这将打印lol
。