建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

Java中,实例化子类会实例化父类么(补充篇)(java中父类与子类之间的转换示例)

GG网络技术分享 2025-03-18 16:13 0


Java中,实例化子类会实例化父类么(补充篇)

前言

前几天有一个小伙伴给我留言,提出了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中父类与子类之间的转换示例

java中父类与子类之间的转换示例有以下三点:

示例一

父类强制转子类

pre class=\"brush:php;toolbar:false\">Father f = new Son();
Son s = (Son)f;//可以

创建一个父类的实例,想要强制把父类对象转换成子类的,不行!通俗的想,真正当爹的永远不可能装儿子。

java中父类与子类之间的转换示例 (https://www.wpmee.com/) javascript教程 第1张

示例二

“假的”父类强制转子类

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