java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序
先说结论
对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成员变量的赋值和实例代码块 -> 子类的构造函数。
实验代码如下:
public class ExtensionTest {
public static void main(String[] args) {
new SubClass();
}
}
class SuperClass
{
{
System.out.println("我是父类实例块");
}
static {
System.out.println("我是父类类构造块");
}
public SuperClass()
{
System.out.println("我是父类构造函数块");
}
}
class SubClass extends SuperClass
{
{
System.out.println("我是子类实例块");
}
static {
System.out.println("我是子类类构造块");
}
public SubClass()
{
System.out.println("我是子类构造函数块");
}
}
结果:
我是父类类构造块
我是子类类构造块
我是父类实例块
我是父类构造函数块
我是子类实例块
我是子类构造函数块
解释:
类构造块是初始化类的时候执行的,而初始化类首先得加载类(不加载类进内存当然没法初始化)。
类实例块是放在该类构造函数最前面和父类构造函数之后执行的。因为子类的构造函数调用之前,会先调用父类的构造函数。
基于上述两条规则,我们再来看执行顺序。
new SubClass()也就是要构造SubClass这个类的一个对象,而要构造这个对象,首先必须把这个类的描述、定义加载进内存(类加载)。因此要先加载这个类(不过此时还未初始化)。
加载完这个类之后,想要构造这个类的对象。但是此时这个类的静态变量还未被初始化,因此要先初始化这个类,但是初始化这个类需要先初始化它的父类,因此此时就变成了,加载父类->初始化父类(调用静态块,即类构造块)
->初始化子类(调用静态块,即类构造块)。
然后就可以构造这个类的对象了,构造这个类的对象之前,要先构造父类对象,因此会先调用父类的构造函数,而调用父类构造函数之前又会先调用父类的实例块。
然后就到了子类构造函数,然而执行之前一样要先调用子类的实例块,最后才是子类的构造函数的函数体。
java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序相关推荐
- java运行python脚本_java中执行python脚本工具类详解
java中执行python脚本工具类,需要jython.jar import java.io.FileInputStream; import java.io.IOException; import j ...
- java 向上取整_java 中的异常处理和常用类使用
一.异常: 1.异常的简单介绍: Throwable类 / Error Exception | | Unchecked Checked Runtime Exception Exception Exce ...
- java filewriter写入文件_Java中的写入字符文件类FileWriter
上一章中我们介绍字符读取文件的类FileReader,这一章我们介绍 FileWriter主要是以字符的方式写入文件中的类. import java.io.File; import java.io.F ...
- 对象数组的初始化_JAVA中数组是什么?
Java中数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特点: ...
- java流的序列化_Java中的对象流和序列化介绍
最近,在讲流的使用,其中对象流的作用其实就是将自定义类的对象与流之间相互转换的流. 看起来还是挺简单的,那么看下面的例子: public class Student{ private int id; ...
- java注解和反射原理_Java中的注解和反射
最近又回顾了一下 Java 中的注解和反射知识点,注解在日常开发中使用很多,但是反射比较少.值得注意的是 Java 的各种框架底层源码中大量使用了注解和反射,阅读源码,这些是基本功,面试中这部分内容也 ...
- java分布式对象——远程方法中的参数和返回值+远程对象激活
[0]README 1)本文文字描述转自 core java volume 2, 旨在学习 java分布式对象--远程方法中的参数和返回值+远程对象激活 的相关知识: [1]远程方法中的参数和返回值 ...
- java 异常处理发生异常_Java中的异常处理
java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...
- java jframe创建窗体_Java中利用JFrame创建窗体
1. 一个简单例子: Java代码 public class Test(){ public static void main(String[] args){ JFrame frame = new ...
最新文章
- 【每日一题】502. IPO
- Python3 与 C# 网络编程之~ 网络基础篇
- boost::ratio_less相关的测试程序
- Xamarin.Android 使用ListView绑定数据
- linux mysql 系统时间函数吗_Linux 宝库 - Mysql日期和时间函数不求人
- c语言微信备份文件,文件保存后自动刷新微信小程序
- np.newaxis学习【转载】
- oracle em搭建,【oracle】手动安装EM
- Java集合--WeakHashMap
- bp神经网络数字识别matlab_pytorch神经网络实践(1): 安装与初次使用pytorch搭建神经网络实践手写数字识别教程
- windows 10上fastboot无法识别设备问题
- 两款强大的PC优化工具推荐,CleanMyPc与Memreduct
- http://www.cashfiesta.com/php/join.php?ref=cyc5867
- 夏磊2019MySQL高级学习笔记
- MySQL事务的操作
- Rest Api 项目添加 Basic Auth 认证
- 按钮(Button, ImageButton)
- MACHINE-CHECK-EXCEPTION蓝屏
- calender加3天_JAVA日期或者时间加减法,加上几天或者减去
- 什么是HRMS?哪些工作需要使用HRMS?
热门文章
- 显示器接口_显示器带全能Type-C接口用起来有多爽?
- ipv4改完保存不成功_win7系统没法保存修改后IP地址的解决方法
- C++基础与深度解析第三章:数组、vector与字符串
- 计算机系英文简历技能skill,如何填英文简历中SKILL选项
- python字典长度可变吗_关于在Python3中:字典在迭代过程中,字典的长度是不允许改变的...
- java冒泡排序_Java专题(二):Java中常见的排序算法有哪些?---冒泡排序
- C++socket编程(八)8.3:UDP广播
- 事态升级是什么意思_农村老俗话说“男吵官司女吵穷”是什么意思呢,有没有道理?...
- java 随机获取4个数字_java入门-验证码 今天查到的一个简单随机生成4位数字的验证码-jsp...
- 未来教育计算机二级答案19,2019年3月计算机二级MSOffice提分试题及答案019