Java中私有变量与继承
首先我们来看一下java中的继承
class A{
int a = 10;
}
class B extends A{
// int a = 20;
int b = 30;
}
public class Inherit {
public static void main(String[] args) {
B b = new B();
System.out.println(b.a);
}
}
此时的运行结果为:
可以看到,class B继承了A中默认的公共变量a,其值为10,因此通过子类B也能访问到父类A的公共变量。
当class B中也有一个和父类A相同的公共变量a时:
class B extends A{
int a = 20;
int b = 30;
}
运行结果为:
说明子类B中的a覆盖掉了父类的a。
当我们把父类A中的成员变量a定义为私有时,且子类B中没有同名的变量:
class A{
private int a = 10;
}
class B extends A{
int b = 30;
}
此时,B的实例化对象b是访问不到父类A的成员变量a的,程序会报错,提示a为父类的私有变量:
那么问题来了,是因为私有变量不能被继承,还是私有变量被继承了以后不能被访问呢?举个简单例子,还是和上面一样,只不过在父类A中加入一个成员函数返回私有变量的值:
class A{
private int a = 10;
public int getNumber(){
return a;
}
}
我们将上面的b.a改成b.getNumber():
public class Inherit {
public static void main(String[] args) {
B b = new B();
System.out.println(b.getNumber());
}
}
结果如下:
子类B通过继承父类A中公有的getNumber()访问到了父类A中的私有变量a。但是还是存在疑问,是私有变量被继承了还是只有公有的成员函数被继承了?逻辑上都能说得通,网上两边都有赞同的人。大部分人还是倾向与私有变量也能被继承,但是不好证明,可能需要进一步学习java虚拟机的底层原理,在此只证明一下网上举的一些错误的例子,比如有人说打断点的时候看到内存里有父类的私有变量,其实还是说明不了私有变量被继承:
此处的a=10不一定是继承来的,也可能是父类方法调用的自身变量。
后续进一步学习后再来从底层解释私有变量是否可以被继承的问题。