为什么继承的公共方法操纵超类的私有属性而不是子类?

时间:2015-05-06 02:28:06

标签: java inheritance private public

在下面的代码中,当我运行Test2时,为什么打印null而不是lol?似乎config方法修改了类a的{​​{1}}属性,而不是Test

但是继承操纵私有属性的公共方法的意义是什么呢,为什么他们这样设计Java呢?

编辑:

不得修改类Test2。我想要做的是重用Test方法。我为config定义了一个私有属性a,但Test2只是忽略它并使用config的私有属性。一个方法不应该使用它所在的类的属性而不是继承的超类的属性吗?

Test

2 个答案:

答案 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