Java子类初始化调用父类无参构造
实在是服了自己,子类初始化调用父类无参构造这种初学者都应该知道的事,我给忘了。
记得当初看书的时候各种概念抄在笔记本上,再上机实践,以为一辈子都不会忘,还是给忘了。
这件事说明了两个问题:
1.我没有保持专注。
2.不管记性好坏都必须要复习。
我们知道在Java中,子类初始化的时候(不管是通过有参构造还是无参构造),如果继承有父类,都会先去调用父类
的无参构造。
这个没有问题,但是如果在父类和子类中都有static代码块和普通代码块,他们的执行先后顺序又是怎样的呢?先来看一段代码:
A类
package com.test; /**
* @author zhangxingrui
* @create 2019-03-24 21:00
**/
public class A { static {
System.out.println("我是A的static代码块");
} {
System.out.println("我是A的普通代码块");
} public A(){
System.out.println("我是A的构造方法");
} }
B类
package com.test; /**
* @author zhangxingrui
* @create 2019-03-24 21:01
**/
public class B extends A { static {
System.out.println("我是B的static代码块");
} {
System.out.println("我是B的普通代码块");
} public B(){
System.out.println("我是B的构造方法");
} }
Main类
package com.test; /**
* @author zhangxingrui
* @create 2019-03-24 21:00
**/
public class Main { public static void main(String[] args) {
B b = new B();
System.out.println("---我是可爱的分割线---");
B b2 = new B();
} }
好的,代码如上,现在来看程序执行结果:

可以看到,执行顺序是:
A的静态代码块 》B的静态代码块》A的普通代码块》A的构造方法》B的普通代码块》B的构造方法;
同时B被new了两次,但是静态代码块只执行了一次。。。
这说明了啥,说明了A不是在new的时候被执行的,而是在JVM将class文件装载进入内存的时候就办了(JVM将class加载到内存以后会做很多
动作,比如验证、链接、解析等等)。
而普通代码块和构造方法都是在实例化对象的时候才被执行的。
同时也验证了上面说的,子类在初始化的时候会调用父类的无参构造。
Java子类初始化调用父类无参构造的更多相关文章
- C#子类如何调用父类
C#中子类是如何调用父类的?带着这个问题,体验如下: □ 通过子类无参构造函数创建子类实例 创建父类Person和子类Student. public class Person { public Per ...
- JAVA基础——构造函数方法总结(有参构造和无参构造)
使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...
- java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。
/*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog { ...
- 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值
package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...
- Java通过反射技术动态创建对象(有参、无参构造)
实现类: package com.ljy; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTarge ...
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...
- 【Spring】XML方式实现(无参构造 有参构造)和注解方式实现 IoC
文章目录 Spring IoC的实现方式 XML方式实现 通过无参构造方法来创建 1.编写一个User实体类 2.编写我们的spring文件 3.测试类 UserTest.java 4.测试结果 通过 ...
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- java 子类强转父类 父类强转子类
Java 继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. Java 子类强转父类 父类引用指向子类对象: jav ...
随机推荐
- node(一)安装nodejs最新版到debian,ubuntu,mint系统
从官网得到,测试可以使用,本机为linux mint18 官网原文链接在此 // 直接使用sudo apt install nodejs安装的版本较老,而且命令必须使用nodejs // ...
- 关于右键属性与du -sh显示的文件大小不一致的解决
du -sh filename(其实我们经常用du -sh *,显示当前目录下所有的文件及其大小,如果要排序再在后面加上 | sort -n) 关于右键属性与du -sh显示的文件大小不一致的解决 ...
- Python 把数据库的数据导出到excel表
import io,xlwt def export_excel(request): """导出数据到excel表""" list_obj = ...
- set集合HashSet
一: 和List接口同一级的还有Set接口,Set类型的集合,元素不能重复,存储顺序和迭代顺序没有必然联系.他的元素的唯一性是由hasCode和equals决定的. 他的子类,常用的HashSet和L ...
- keepalived + nginx(负载均衡反向代理HTTP,https) + tomcat(HTTP,https)
基本架构: nginx(192.168.116.198) client --->keepalived(116.200) ------> tomcat (192.16 ...
- unlink与close关系
close和unlink.以前时候总是不太理解两者的区别,最近看到一篇博客比较详细地描述了二者的本质区别,这里我引用了它的原文. “每一个文件,都可以通过一个struct stat的结 ...
- IOPS、带宽(band width)、吞吐量 (throughput)
SAN和NAS存储一般都具备2个评价指标:IOPS和带宽(throughput),两个指标互相独立又相互关联.体现存储系统性能的最主要指标是IOPS. IOPS (Input/Output Per ...
- 【敏捷实用工具】JIRA介绍以及使用方法
敏捷开发并不是由敏捷工具来推动的.但是没有敏捷工具的支持,就很难进行各种软件工程的相关事件,工具的作用是约束和流程,正确使用敏捷工具可以事半功倍,实践敏捷.近几年来敏捷开发催生大量敏捷工具的产生,在敏 ...
- iOS 11 使用方法替换(Method Swizzling),去掉导航栏返回按钮的文字
方法一:设置BarButtonItem的文本样式为透明颜色,代码如下: [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegro ...
- MariaDB中文乱码之解决思路
首先出现乱码的原因就是编码不一致问题引起的,那么就从以下2个方面入手: 1.应用层:前提条件数据库服务端存储的中文数据是对的,但是页面上显示乱码,这里只需要检查你的项目的编码格式,设置成一致就行. 2 ...