全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

详解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小时内与您取得联系。