Java 中子类能继承父类的私有属性吗?

先看下面一段代码

/**
 * 定义父类
 * @author CBS
 */
public class Father {
    private String name;//私有属性
    private char sex;
    
    public void tell(){
        System.out.println(name+sex);
    }
    
    private void speak(){
        System.out.println(name+"is speaking!");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

}

/**
 * 定义子类,子类中什么都不写。
 * @author CBS
 */
public class Child extends Father {

}


/**
 * 定义测试类
 * @author CBS
 */
public class Test {

    public static void main(String[] args) {
        
        Child c=new Child();
        c.tell();//tell方法是可以用的
        //c.speak();//报错,父类的私有方法不可见
    }

}
 

我们可以看到测试类中即使没有给Child类对象的属性进行赋值,tell方法依旧是可用的。如果Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的所有东西,而修饰符只是影响属性或者方法对外是否可见。

但是个人比较同意Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。

Java中修饰符的作用是封装类中的属性和方法使其对外不可见,官方文档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提高代码的重用性,封装则保护了代码的不可见部分。在编写代码的过程中,我们显然即想提高代码的重用性,也不希望类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就生活中的例子来说,Java官方文档的解释也很契合。比如,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。

转载自:https://www.cnblogs.com/cbs-writing/p/7088450.html

猜你喜欢

转载自blog.csdn.net/Leo_01169/article/details/86562912