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);
    }
}

此时的运行结果为:

java中怎么给私有变量赋值 java私有变量_父类

可以看到,class B继承了A中默认的公共变量a,其值为10,因此通过子类B也能访问到父类A的公共变量。

当class B中也有一个和父类A相同的公共变量a时:

class B extends A{
    int a = 20;
    int b = 30;
}

运行结果为:

java中怎么给私有变量赋值 java私有变量_子类_02

说明子类B中的a覆盖掉了父类的a。

当我们把父类A中的成员变量a定义为私有时,且子类B中没有同名的变量:

class A{
    private int a = 10;
}
class B extends A{
    int b = 30;
}

此时,B的实例化对象b是访问不到父类A的成员变量a的,程序会报错,提示a为父类的私有变量:

java中怎么给私有变量赋值 java私有变量_子类_03

那么问题来了,是因为私有变量不能被继承,还是私有变量被继承了以后不能被访问呢?举个简单例子,还是和上面一样,只不过在父类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());
    }
}

结果如下:

java中怎么给私有变量赋值 java私有变量_子类_04

子类B通过继承父类A中公有的getNumber()访问到了父类A中的私有变量a。但是还是存在疑问,是私有变量被继承了还是只有公有的成员函数被继承了?逻辑上都能说得通,网上两边都有赞同的人。大部分人还是倾向与私有变量也能被继承,但是不好证明,可能需要进一步学习java虚拟机的底层原理,在此只证明一下网上举的一些错误的例子,比如有人说打断点的时候看到内存里有父类的私有变量,其实还是说明不了私有变量被继承:

java中怎么给私有变量赋值 java私有变量_私有变量_05

此处的a=10不一定是继承来的,也可能是父类方法调用的自身变量。

后续进一步学习后再来从底层解释私有变量是否可以被继承的问题。