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;
}
}
因此子类不能继承父类的私有变量及其方法,或者说仅仅拥有,但是不能直接使用。