Products
GG网络技术分享 2025-03-18 16:13 0
前几天有一个小伙伴给我留言,提出了2个疑问:
实话实说,看到这个小伙伴的问题时…我一下子懵住了,很久没有看JVM的内容,一时有些语塞…今天特地抽了些时间重新整理了一下。
问题一:子类实例为什么会有父类的成员变量?
这个问题,怪我并没有get到点…为什么会有?因为继承呐,继承在Java规范中的语义就是能够拥有父类中protect及以上权限的变量和方法。规范要求,不得不从~
我猜这个小伙伴可能是问另一个意思:子类通过什么样的方式拥有了父类的成员变量。
如果是这个问题,那么其实和问题二是差不多的。所以让我们从问题二中找寻答案…
问题二: 它的初始化是通过哪种方式访问了父类对象中的表?
写了俩个很简单的子/父类:
public class Son extends Father {
public String nick;
}
public class Father {
public String name;
}
然后javap -v看一下Son.class:
注意看常量池(Constant pool)里的#3。#3被映射到#14上,而#14怎是我们的Father的CONSTANT_Class_info。通过此就可以定位到我们Father,因此也就可以找到到其中的属性/方法。
换一种理解,子类的实例中已经包含了父类属性,为什么?因为此时至始至终都是一块内存空间,我们可以用一小段代码,验证这个问题:
public class Son extends Father {
public String nick;
public Son(){
System.out.println(super.equals(this));
}
}
run起来,你会发现是true。也就是说super的引用和this的引用是同一个。既然是同一个,那就不可能是两个内存空间。
以上,是基于我理解的解答。如果有什么不妥之处,欢迎评论区指出并交流~~
java中父类与子类之间的转换示例有以下三点:
示例一
父类强制转子类
pre class=\"brush:php;toolbar:false\">Father f = new Son();
Son s = (Son)f;//可以
创建一个父类的实例,想要强制把父类对象转换成子类的,不行!通俗的想,真正当爹的永远不可能装儿子。
示例二
“假的”父类强制转子类
Father f = new Son();Son s = (Son)f;//可以
父类对象引用着一个子类实例。分析:
Son类特有的属性暂时不能通过 f 来操作,因为Father类没有Son类(子类)的特有属性。
接着创建子类对象 s,它引用的是父类对象 f 强制转换来的对象(其实就是个装爹的Son,把他强制转回了Son),这时就可以通过 s 来操作子类的特有属性了。
通俗的说就是儿子装爹,终究是儿子,本质没变,还是可以把他强制转回儿子的。
示例三
子类强制转父类
Son s = new Son();Father f = (Father)s;//可以
子类转换成父类,只是子类对象的特有属性无法利用 f 操作,f 可以操作其非特有的属性(由父类继承而来的属性)。分析:
通俗的说,儿子和爹的共同点——“都是人”,儿子是人是从父亲继承而来的,他们都有人的基本行为,只是儿子永远不可能和父亲平辈(子类类型转换成父类类型)。
Demand feedback