详解java中继承关系类加载顺序问题

实例代码:
/**
* Created by fei on 2017/5/31.
*/
public class SonClass extends ParentClass{
public SonClass(){
System.out.println("SonClass's constructor");
}
{ System.out.println("SonClass's block");}
static {
System.out.println("SonClass's static block ");
}
public static void main(String[] args) {
System.out.println("------ main start ------ ");
new SonClass();
System.out.println("------ main end ------ ");
}
}
class ParentClass{
public ParentClass(){
System.out.println("ParentClass's constructor");
}
{ System.out.println("ParentClass's block");}
static {
System.out.println("ParentClass's static block ");
}
}
运行结果:
ParentClass's static block SonClass's static block ------ main start ------ ParentClass's block ParentClass's constructor SonClass's block SonClass's constructor ------ main end ------
根据运行结果,一目了然,在执行 main 方法中 new SonClass() 之前,就在类加载之后执行了类中 static 代码块。然后再进入main方法,执行new操作,当然显而易见,在执行new子类操作的时候,是要先进行其父类的构造,即先执行父类的构造代码块(代码中只用大括号包裹的那段代码)以及构造函数 ,然后再执行子类的构造代码块以及构造函数。
修改一下代码,再来看看运行的结果:
/**
* Created by fei on 2017/5/31.
*/
public class SonClass extends ParentClass{
ParentClass parentClass;
public SonClass(){
System.out.println("1");
}
public SonClass(String name){
System.out.println("2");
this.name = name;
parentClass = new ParentClass("FEI");
}
public static void main(String[] args) {
System.out.println("------ main start ------ ");
new SonClass("fei");
System.out.println("------ main end ------ ");
}
}
class ParentClass{
String name ;
public ParentClass(){
System.out.println("3");
}
public ParentClass(String name){
System.out.println("4");
this.name = name ;
}
}
运行的顺序是:
------ main start ------ 3 2 4 ------ main end ------
第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super(); 这样就会调用父类没有参数的构造方法。
第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。
总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。
还是两个类,我们再更改一下。
/**
* Created by fei on 2017/5/31.
*/
public class SonClass extends ParentClass{
private String name = "SonClass";
public SonClass() {
printName();
}
public void printName() {
System.out.println("SonClass print name: " + name);
}
public static void main(String[] args){
new SonClass();
}
}
class ParentClass{
private String name = "ParentClass";
public ParentClass() {
//System.out.println(this.getClass());
printName();
}
public void printName() {
System.out.println("ParentClass print name: " + name);
}
}
看了上面的两个例子,最后这个例子就很容易被迷惑,可能有人会觉得运行结果是类似这样的:
ParentClass print name: ParentClass SonClass print name: SonClass
或者是:
ParentClass print name: SonClass SonClass print name: SonClass
但真正的结果是这样的:
SonClass print name: null SonClass print name: SonClass
为什么会这样,其实只要打开代码中父类构造器中的这句注释,就很容易理解了:System.out.println(this.getClass())
结果是:
class SonClass
没错,父类中的this引用是子类实例对象,所以在父类构造函数里调用的还是子类的printName()方法。具体原因也并我能十分肯定,我个人浅见,是因为虽然我们调用了父类的构造方法,但是我们并没有实例化出父类的实例对象,所以this还是指向的是子类的引用。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java继承关系类加载顺序问题
# java继承关系类加载顺序实例详解
# java中子类继承父类
# 程序运行顺序的深入分析
# java中 IO 常用IO操作类继承结构分析
# java子类继承父类实例-披萨的选择实现代码
# java用接口、多态、继承、类计算三角形和矩形周长及面积的方法
# Java内部类的继承(全)
# JAVA 继承基本类、抽象类、接口介绍
# java类中元素初始化顺序详解
# Java类初始化和实例化中的2个“雷区”
# 解析Java虚拟机中类的初始化及加载器的父委托机制
# Java类继承关系中的初始化顺序实例详解
# 子类
# 类中
# 很容易
# 然后再
# 其父
# 的是
# 加载
# 就会
# 是因为
# 就在
# 看了
# 结果是
# 第一个
# 是这样
# 就不
# 当你
# 你自己
# 我能
# 用了
# 希望能
相关文章:
如何在IIS7上新建站点并设置安全权限?
网站图片在线制作软件,怎么在图片上做链接?
建站之星24小时客服电话如何获取?
如何快速生成高效建站系统源代码?
再谈Python中的字符串与字符编码(推荐)
如何在香港服务器上快速搭建免备案网站?
建站之星云端配置指南:模板选择与SEO优化一键生成
高防服务器租用首荐平台,企业级优惠套餐快速部署
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何在服务器上配置二级域名建站?
如何确保FTP站点访问权限与数据传输安全?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何在橙子建站上传落地页?操作指南详解
电脑免费海报制作网站推荐,招聘海报哪个网站多?
实例解析angularjs的filter过滤器
建站主机服务器选购指南:轻量应用与VPS配置解析
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何选择PHP开源工具快速搭建网站?
如何在阿里云虚拟主机上快速搭建个人网站?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
定制建站价位费用解析与套餐推荐全攻略
如何用好域名打造高点击率的自主建站?
建站之星安装步骤有哪些常见问题?
建站168自助建站系统:快速模板定制与SEO优化指南
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何选择CMS系统实现快速建站与SEO优化?
如何通过wdcp面板快速创建网站?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
南平网站制作公司,2025年南平市事业单位报名时间?
制作证书网站有哪些,全国城建培训中心证书查询官网?
电商平台网站制作流程,电商网站如何制作?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
建站之星伪静态规则如何设置?
高端建站如何打造兼具美学与转化的品牌官网?
代购小票制作网站有哪些,购物小票的简要说明?
如何彻底卸载建站之星软件?
建站之星官网登录失败?如何快速解决?
建站之星后台管理如何实现高效配置?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Android使用GridView实现日历的简单功能
C++时间戳转换成日期时间的步骤和示例代码
如何通过云梦建站系统实现SEO快速优化?
如何获取上海专业网站定制建站电话?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
建站之星上传入口如何快速找到?
*请认真填写需求信息,我们会在24小时内与您取得联系。