Java中 子类能否继承父类的私有变量及其方法

103 阅读2分钟

Java中 子类能否继承父类的私有变量及其方法

首先我们提供如下父类,Employee.java,该类中有一个私有变量salary,我们为该变量提供getter和setter方法,此外还有一个私有的测试方法,什么也不做;

public class Employee {

    private int salary;

    public Employee() {
    }

    public Employee(int salary) {
        this.salary = salary;
    }



    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    private void test(){

    }
}

接下来创建Manager.java使其继承Employee方法,该类中有一个私有变量奖金bonus,我们重写getSalary方法,使其返回bonus和salary之和

public class Manager extends Employee{

    private int bonus;

    public Manager(int bonus) {
        this.bonus = bonus;
    }

    public Manager(int salary, int bonus) {
        super(salary);
        this.bonus = bonus;
    }

    public int getBonus() {
        test();  // 'test()' has private access in 'test.Employee'
        return bonus;   
    }
    
    @Override
    public int getSalary() {
        return bonus + salary;  //'salary' has private access in 'test.Employee'
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
}

对于私有方法的访问一般需要修改原方法权限修饰符,或者是创建对象进行访问。但是一般情况下我们并不会在其他类中访问某一个类的私有方法,主要原因是一般情况下被private修饰的方法通常情况下用来对该类的的其他方法提供支持,比如对类某些方法的公共部分进行提取,这些提取的方法外部一般不会使用,所以对其进行了私有化。

对于私有变量的访问我们可以使用getter和setter方法,如下所示,需要注意的是直接调用getSalary方法会导致无限递归的情况,因为默认调用的是子类重写的方法,为了解决这个问题我们使用super关键字,表明调用的是父类的方法。

package test;

public class Manager extends Employee{

    private int bonus;

    public Manager(int bonus) {
        this.bonus = bonus;
    }

    public Manager(int salary, int bonus) {
        super(salary);
        this.bonus = bonus;
    }

    public int getBonus() {
        return bonus ;
    }

    @Override
    public int getSalary() {
        //return bonus +getSalary();  //该方法会死循环调用自身,而非父类的getSalary;
        return bonus + super.getSalary(); 
    }

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }
}

因此子类不能继承父类的私有变量及其方法,或者说仅仅拥有,但是不能直接使用。