博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础之类的加载顺序。
阅读量:3908 次
发布时间:2019-05-23

本文共 1220 字,大约阅读时间需要 4 分钟。

新月伊始,九月的第一天,心情不是很好,因为后天就要演讲了,由于没有上过几次台,还是比较担心的…

言归正传…贴一个代码

public class Base{
private String baseName = "base"; public Base() {
callName(); } public void callName() {
System. out. println(baseName); } static class Sub extends Base {
private String baseName = "sub"; public void callName() {
System. out. println (baseName) ; } } public static void main(String[] args) {
Base b = new Sub(); }}

题目想要考的是继承,类的加载顺序,以及多态这一块的知识,如果掌握得不是很熟悉的话,这道题很容易出错。

1.首先,需要明白类的加载顺序。

(1) 父类静态(静态属性,静态代码块(只加载一次),但不包括静态方法)
(2) 子类静态(静态属性,静态代码块(只加载一次),但不包括静态方法 )
(3) 父类非静态代码块( 成员变量,非静态代码块 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 成员变量,非静态代码块 )
(6) 子类构造函数
其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)
2.其次,需要理解子类覆盖父类方法的问题,也就是方法重写实现多态问题。
Base b = new Sub();它为多态的一种表现形式,声明是Base,实现是Sub类, 理解为 b 编译时表现为Base类特性,运行时表现为Sub类特性。
当子类覆盖了父类的方法后,意思是父类的方法已经被重写,题中 父类初始化调用的方法为子类实现的方法,子类实现的方法中调用的baseName为子类中的私有属性。
由1.可知,此时只执行到步骤4.,子类非静态代码块和初始化步骤还没有到,子类中的baseName还没有被初始化。所以此时 baseName为空。 所以为null。

最后总结:

静态代码块(只加载一次)
构造方法(创建一个实例就加载一次)
静态方法,调用的时候才会加载,不调用的时候不会加载
静态语句块和静态变量被初始化的顺序与代码先后顺序有关
一个类中可以有多个构造代码块,按照顺序执行。

关于类的加载顺序,贴一个我觉得讲解的比较好的博客:

转载地址:http://urlen.baihongyu.com/

你可能感兴趣的文章
USB通信记事
查看>>
Android 编译(1)——Android编译步骤梳理
查看>>
编译器配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识
查看>>
RK3399 OV13850摄像头配置
查看>>
Android 编译(2)——jack-server相关问题
查看>>
网络服务(2)——以太网配置IPV4和IPV6
查看>>
网络服务(3)——以太网phy的识别加载(RK3399)
查看>>
网络服务(5)——usb网卡名称修改(RK3399 Ubuntu)
查看>>
行业观察与理解-互联网巨幕下各行业的现状和发展
查看>>
数据结构与算法大全
查看>>
稳定排序和不稳定排序
查看>>
句柄泄露与CloseHandle()
查看>>
一些笔记
查看>>
SVN的安装和使用
查看>>
APP测试点分析
查看>>
JDK安装过程中出现“javac不是内部或外部命令”问题的解决
查看>>
Git使用教程
查看>>
APT使用指南
查看>>
adb介绍
查看>>
Android lint相关
查看>>