Java 为什么继承的公共方法操作超类';s的私有属性而不是子类?
在下面的代码中,当我运行Test2时,为什么它会打印Java 为什么继承的公共方法操作超类';s的私有属性而不是子类?,java,inheritance,private,public,Java,Inheritance,Private,Public,在下面的代码中,当我运行Test2时,为什么它会打印null,而不是lol?似乎config方法修改了类Test的a属性,而不是Test2 但是继承处理私有属性的公共方法有什么意义呢?为什么他们要这样设计Java 编辑: 等级试验不得修改。我想做的是重用config方法。我为Test2定义了一个私有属性a,但是config只是忽略它,并使用Test中的一个属性。方法不应该使用它所在的类的属性而不是继承的超类的属性吗 public class Test { private String a
null
,而不是lol
?似乎config
方法修改了类Test
的a
属性,而不是Test2
但是继承处理私有属性的公共方法有什么意义呢?为什么他们要这样设计Java
编辑:
等级试验
不得修改。我想做的是重用config
方法。我为Test2
定义了一个私有属性a
,但是config
只是忽略它,并使用Test
中的一个属性。方法不应该使用它所在的类的属性而不是继承的超类的属性吗
public class Test {
private String a;
public void config() {
a = "lol"
}
}
public class Test2 extends Test {
private String a;
public void print() {
config();
System.out.println(a);
}
public static void main(String[] args) {
print()
}
}
简而言之,目的是封装。您不需要也不能从类外访问私有的内容。做你想做的事情的公认模式是使用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();
}
}
config方法似乎修改了类Test
的a属性,而不是Test2
对
为什么它会打印null
而不是lol
您有两个同名的变量。一个在超类Test
中,另一个在子类Test2
中。两者都被命名为a
,但它们指的是不同的事物
超类中的方法config()
引用超类a
,子类中的方法print()
引用子类a
。因为变量是私有的,所以两个方法都不能在另一个类中看到变量
为什么他们要这样设计Java
这就是private
的本质。没有人能看到它
在我看来,您实际上希望受保护的变量的行为:
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
不,这不是我想做的。我真正想做的是使用config
方法更改Test2
的属性a
。方法config
已经被类Test2
继承了,那么它更改的私有属性a
应该是Test2
中的一个,这不是自然发生的事情吗?@shady No,因为a
属于Test2
,除了为它公开一个getter/setter之外,您无法从Test
访问它。我已编辑了我的答案,以满足您的要求。注意,Test
是abstract
。在我的例子中,类Test
不能修改。我知道classTest
的属性a
不能被classTest2
访问。但是我想重用config
方法,并为类Test2
定义一个私有属性a
。但是config
仍然使用Test
的a
属性@shady如果您根本无法更改Test
,您想做的事情就无法完成。不能重写Java中的字段,这就是为什么必须重写getter/setter。这是否意味着尽管Test2
继承了方法config
,但它没有方法config
的副本。如果子类想要使用属性a
,这意味着a
应该从超类Test
继承,这会导致Test
的更改,因为它是继承的。config
方法使用它所在的类的属性,并且它在超类中。如果允许超类中的方法操作子类中的私有字段来破坏封装,那就不好了。