前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java的类加载顺序实验

Java的类加载顺序实验

原创
作者头像
逆回十六夜
修改2019-08-07 17:57:04
9280
修改2019-08-07 17:57:04
举报
文章被收录于专栏:逆回十六夜

先准备3个逐层继承的类User1,User2,User3

User2继承User1,User3继承User2

分别在类中准备构造函数,普通初始化块,静态代码块

代码语言:javascript
复制
public class User1 {
    public User1(){
        System.out.println("User1的构造函数调用");
    }
    {
        System.out.println("User1的普通初始化块");
    }
    static{
        System.out.println("User1的静态初始化块");
    }
}
代码语言:javascript
复制
public class User2 extends User1 {
    public User2(){
        System.out.println("User2的构造函数调用");
    }
    {
        System.out.println("User2的普通初始化块");
    }
    static{
        System.out.println("User2的静态初始化块");
    }
}
代码语言:javascript
复制
public class User3 extends User2{
    public User3(){
        System.out.println("User3的构造函数调用");
    }
    {
        System.out.println("User3的普通初始化块");
    }
    static{
        System.out.println("User3的静态初始化块");
    }
}
代码语言:javascript
复制
public class Main {
    public static void main(String[] args){
     User3 user3 = new User3();
    }
}

执行结果

代码语言:javascript
复制
User1的静态初始化块
User2的静态初始化块
User3的静态初始化块
User1的普通初始化块
User1的构造函数调用
User2的普通初始化块
User2的构造函数调用
User3的普通初始化块
User3的构造函数调用

静态代码块------------->普通初始化块--------------->构造函数

构造函数先执行父类,再执行子类的原理:

  • Java默认在无参的构造函数中会执行super(),则会递归执行构造函数,因而先执行父类再执行子类

有参构造的情况:

先扩展代码:

代码语言:javascript
复制
public class User1 {
    private String name;
    public User1(){
        System.out.println("User1的无参构造函数调用");
    }
    public User1(String aname){
        this.name = aname;
        System.out.println("User1的有参构造函数调用");
    }
    {
        //System.out.println("User1的普通初始化块");
    }
    static{
        //System.out.println("User1的静态初始化块");
    }
}
代码语言:javascript
复制
public class User2 extends User1 {
    public String name;
    public User2(){
        System.out.println("User2的无参构造函数调用");
    }
    public User2(String aname){
        this.name = aname;
        System.out.println("User2的有参构造函数调用");
    }
    {
        //System.out.println("User2的普通初始化块");
    }
    static{
        //System.out.println("User2的静态初始化块");
    }
}
代码语言:javascript
复制
public class User3 extends User2{
    public String name;
    public User3(){
        System.out.println("User3的无参构造函数调用");
    }
    public User3(String aname){
        this.name = aname;
        System.out.println("User3的有参构造函数调用");
    }
    {
        //System.out.println("User3的普通初始化块");
    }
    static{
        //System.out.println("User3的静态初始化块");
    }
}
代码语言:javascript
复制
public class Main {
    public static void main(String[] args){
     //User3 user3 = new User3();
        User3 user3 = new User3("李云龙");
    }
}

执行结果

代码语言:javascript
复制
User1的无参构造函数调用
User2的无参构造函数调用
User3的有参构造函数调用

显然执行的只有创建的User3执行了有参构造,User2和User1执行的都是无参构造,他们并没有自动调用父类的有参构造。

但如果对代码稍作修改,在有参构造前添加super(anme),即可执行父类的有参构造了

代码语言:javascript
复制
public User3(String aname){
    super(aname);
    this.name = aname;
    System.out.println("User3的有参构造函数调用");
}

无参的构造函数虽然是隐试调用,但是如果子类继承你的类,而你没有无参构造函数,编译会失败

如果你没写构造函数,系统会为你加一个无参构造函数

但是,如果你写了有參的构造函数,系统不会为你加无参构造函数

实验结束

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态代码块------------->普通初始化块--------------->构造函数
  • 构造函数先执行父类,再执行子类的原理:
  • 无参的构造函数虽然是隐试调用,但是如果子类继承你的类,而你没有无参构造函数,编译会失败
  • 如果你没写构造函数,系统会为你加一个无参构造函数
  • 但是,如果你写了有參的构造函数,系统不会为你加无参构造函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档