java中私有变量到底有没有继承?
//父类
public class A {
public int publicNum = 3; //公开变量
private int privateNum = 4; //私有变量
}
//子类
public class B extends A{
int a = publicNum; //直接对父类共开变量操作
int b = privateNum; //对私有变量操作编译报错
}
关于继承的理解
继承的目的是为了对共有属性和行为的抽取,以此达到提高代码复用性的目的,从内存角度分析,继承的本质是在创建子类对象new的过程,调用了父类构造器super();因此在子类对象的堆内存中有一片父类对象的堆内存空间,子类可以调用父类非私有成员变量和方法。
//空参构造
public B() {
super(); //默认调用父类空参构造,如果手动给出则不会默认给出
}
}
也就是说继承的本质是因为对父类构造器的调用,在子类堆内存中生成了父类对象的堆内存,内存图解如下:
理论上来讲,对父类成员的操作都应该发生在子类创建对象之后(调用父类构造器之后),但是从代码上来看,显然在extends关键字之后,就已经能够对父类成员进行操作了,只是不创建子类对象,无法打印查看,这大概也是官方API文档的说法,父类私有成员不能被继承,在学习继承概念的时候,很多人会说私有成员变量是可以继承的,只是需要通过setter&getter方法间接访问。
但是这种间接访问的形式不应该在任何无关类中都可以允许的吗?即便类和类之间没有子父类关系,通过public的get()方法不是同样可以访问吗,所以这跟继承又有什么特殊关系?
总结
关于父类成员继承的问题我个人更倾向是对父类成员的复制,但他又区别于复制,因为如果子类复制了父类成员,那么私有成员应该属于子类的本类成员,理论是可以操作的。
个人目前理解是,对于访问权限允许的成员,子类是复制父类成员,而对于访问权限之外的成员,依旧遵循权限保护问题,只能间接访问
记录问题博文,后期做自己回顾用