Java 为什么继承的公共方法操作超类';s的私有属性而不是子类?

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

在下面的代码中,当我运行Test2时,为什么它会打印
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
不能修改。我知道class
Test
的属性
a
不能被class
Test2
访问。但是我想重用
config
方法,并为类
Test2
定义一个私有属性
a
。但是
config
仍然使用
Test
a
属性@shady如果您根本无法更改
Test
,您想做的事情就无法完成。不能重写Java中的字段,这就是为什么必须重写getter/setter。这是否意味着尽管
Test2
继承了方法
config
,但它没有方法
config
的副本。如果子类想要使用属性
a
,这意味着
a
应该从超类
Test
继承,这会导致
Test
的更改,因为它是继承的。
config
方法使用它所在的类的属性,并且它在超类中。如果允许超类中的方法操作子类中的私有字段来破坏封装,那就不好了。