Java继承

继承可以解决代码复用,将多个类存在的相同属性和方法抽象出父类,在父类中定义这些方法和属性,

子类不需要再定义,只用通过extends来声明继承的父类即可。

语法:

class 子类 extends 父类{ }

细节:

1、子类继承了父类所有的属性和方法,但是私有属性在子类中无法直接访问,需要通过父类提供的公共方法访问。

2、子类必须调用父类的构造器,完成父类的初始化。

会先调用父类的构造器,再调用子类的构造器。

因为在子类的构造器中会默认有一个super(),用来调用父类的无参构造器,

若父类没有无参构造器,则子类必须有一个跟父类对应的有参构造器。

3、当创建子类对象时,无论子类使用哪个构造器,都默认调用父类的无参构造器,

如果父类没有提供无参构造器,则在子类的构造器中必须用super去指定使用父类的

某一个构造器完成父类的初始化工作,否则编译无法通过。

4、如果需要指定调用父类的某个构造器时,需要显式调用一下。super(参数).

5、super(),在使用时,必须放在构造器的第一行。

6、super()和this()都只能放在构造器第一行,那意味着同一个构造器不能同时使用这两个。

this() 和 super() 不能同时出现在一个构造函数里面,因为this()必然会调用其它的构造函数,

其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语

句,就失去了语句的意义,编译器也不会通过。

7、Java所有的类都是object的子类。

8、父类构造器的调用不是只调用直接父类,会一直向上调用,一直追溯到object类(顶级父类).

9、Java是单继承机制,子类只能继承一个父类(直接继承)。

创建子类时内存变化:

1.先在方法区加载类信息,会从顶级父类依次向后加载,在图中则是加载object -> grandpa -> father ->son

2.然后在堆中分配一块空间,因为调用构造器顺序便是顶级父类向下以此执行(上面细节第6条,super()语句都在第一行)。

从顶级父类开始对变量分配空间和初始化,在此例子中则是:

先分配 grandpa 中的name和hobby,二者均为字符串,则需要在常量池分配空间,并指向对应指针。

然后分配 father 中的name和age,name为字符串,在常量池中分配空间初始化之后指向该地址,然后age直接在堆中分配(基本数据类型int)。

最后分配 son 中的name,为字符串,在常量池中分配空间初始化之后指向该地址。

注意,即使每一个类都有name,但是不会遮盖,都有自己的空间。

3.最后将堆中的地址赋值给栈中的变量。

可以发现,三个类中都有name这个属性,那么怎么访问:

按照查找关系返回信息,查找关系:

1、查看子类是否有该属性,有直接返回子类的。

2、如果子类没有,查找父类是否有该属性,有且可以访问,返回信息。

3、如果父类也没有,继续按照该规则向上访问,直到object。

注意:

若将father中的age设为private,虽然不能直接访问,但是在son堆的内存中,依旧有age这个变量。

而且,若通过son.age访问age,即使grandpa类中有一个public的age,依旧无法访问,即按照查

找关系向上找的过程中,只要找到一个同样的变量,若不能访问,即private,无法访问,就会停止向上继续查找。

相关推荐
FQNmxDG4S1 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje2 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv72 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫2 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287922 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本2 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211233 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯5 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188965 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java