Java继承、向上转型

今天看到一个问题,子类对象初始化的时候会不会产生父类对象,去找了找资料,发现不会产生父类对象,并且自己动手验证了的确是这样。在查资料过程中看到一个很有意思的说法,也是《Thinking in Java》中的一段翻译:

“当你创建派生类的对象时,它包含基类的子对象。这个子对象与你自己创建基类的对象是一样的。只是从外部看,基类的子对象被包装在派生类的对象中。”

这段话让我对继承似乎有了重新认识,首先,它说 “这个子对象与你自己创建基类的对象是一样的” ,这表明基类的私有域和私有方法也被包含在派生类的对象中,因而我可不可以理解为继承将会将基类的一切(包括私有部分)都继承下来。那么这又引出了一个问题,Java官方文档说明:

“A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.“

明确表示不能继承私有部分,只能通过public或者protected来访问它们,尴尬了是不是。。。。

继续思考,我想到了《Thinking in Java》中的一段话,大概意思是理论学家总是从自己的立场来说明问题,接着我就尝试用自己的判断来解读下这个问题。

首先我觉得《Thinking in Java》和Java官方文档的话并不冲突,我们可以认为它是从两个方面来看的。《Thinking in Java》可以看作是实际内存的角度,而Java官方文档可以看作是理论角度。

Java官方文档是为了解释继承这一概念,在这一概念的领域中,私有成员的确不会被继承。就像看到有个知友说的,继承就像爸爸有了个孩子,两者相似但是爸爸的私有特征并不会继承给儿子(比如财产),但是你可以通过其他方法访问到这些私有特征(伸手要钱)。Java官方文档从理论上规定了继承的范围。

《Thinking in Java》中是从实际内存角度来看的,派生类可以通过public或者protected方法访问基类的私有成员,那么表明该私有成员一定在内存中,不然怎么访问到。所以它说 “这个子对象与你自己创建基类的对象是一样的”,我觉得没有问题。

另外,个人感觉,从内存角度来理解对于开发人员来说是更好的,下面也是我的个人理解,仅作记录:

基类:私有成员,可访问成员

派生类:基类私有成员、基类可被访问成员 = 原基类可访问成员 + 被重载的基类可访问成员、本身的私有成员、本身的可访问成员

假设A为基类,B为派生类

1、A a = new A ();内存中为基类所有成员,可访问的为所有成员

2、B b = new B ();内存中为派生类所有成员,可访问的为基类可被访问成员、本身的私有成员、本身的可访问成员

3、A a = new B ();内存中为派生类所有成员,可访问的为基类的可被访问成员 = 原基类可访问成员 + 被重载的基类可访问成员

 

其中可以看到向上转型感觉就是对A和B中可访问成员做了个交集,经过实验还发现了一个奇怪有趣的现象。

4、A a = new B ();    B b =  (A) a; 

此时b可访问的为 基类可被访问成员、本身的可访问成员,不晓得怎么解释好。。。。

 

 

 

 

你可能感兴趣的:(学学学Java)