首页 > 编程语言 >[java-基础]-Java构造方法的执行顺序

[java-基础]-Java构造方法的执行顺序

时间:2023-03-08 12:59:05浏览次数:54  
标签:java 构造方法 子类 System new Java 父类 out

(一)Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。

Class ThisClass{
 
}

默认隐式添加无参的构造方法,相当于

Class ThisClass{
    public ThisClass(){
    }
}

2.构造方法的执行顺序。

(1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法。

public ThisClass(){
 
}

默认隐式添加父类无参构造方法,相当于

public ThisClass(){
    super();
}

(2)如果构造方法中在第一条语句调用了本类的重载构造方法,则执行该类的重载构造方法,执行的规则同上。

public ThisClass(){
    this(3);
}   
public ThisClass(int x){
     
}

当调用ThisClass的无参构造方法时,因其第一句调用本类的重载构造方法,所以程序进入有参的重载方法中执行,有参构造方法符合(1)的情况,所以隐式添加父类的构造方法。

注:
(1)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。Constructor call must be the first statement in a constructor.

(2)子类构造方法中没有显式调用父类构造方法时,系统默认调用父类无参构造方法,而如果父类没有无参构造方法,则出现编译错误。没有定义无参构造方法

附: 当new一个对象时,代码的执行顺序

public class Test {
    public static void main(String[] args) {
        System.out.println("×××××第一次new B对象×××××");
        new B();
        System.out.println("×××××第二次new B对象×××××");
        new B();
    }
}
 
class A {
     
    {
        System.out.println("父类A的自由块");
    }
 
    A() {
        System.out.println("父类A的构造方法\n");
    }
 
    D d = new D("父类A的成员变量被初始化\n");
 
    static {
        System.out.println("父类A的静态自由块");
    }
 
    static D dd = new D("父类A的静态成员变量被初始化\n");
}
 
class B extends A {
     
    static D ddd = new D("子类B的静态成员变量被初始化");
     
    static {
        System.out.println("子类B的静态自由块\n");
    }
     
    D dddd = new D("子类B的成员变量被初始化");
 
    B() {
        super();
        System.out.println("子类B的构造方法");
    }
 
    {
        System.out.println("子类B的自由块\n");
    }
}
 
class D {
    D(String str) {
        System.out.println(str);
    }
}

执行结果:

×××××第一次new B对象×××××
父类A的静态自由块
父类A的静态成员变量被初始化
 
子类B的静态成员变量被初始化
子类B的静态自由块
 
父类A的自由块
父类A的成员变量被初始化
 
父类A的构造方法
 
子类B的成员变量被初始化
子类B的自由块
 
子类B的构造方法
×××××第二次new B对象×××××
父类A的自由块
父类A的成员变量被初始化
 
父类A的构造方法
 
子类B的成员变量被初始化
子类B的自由块
 
子类B的构造方法

标签:java,构造方法,子类,System,new,Java,父类,out
From: https://www.cnblogs.com/my-global/p/17182339.html

相关文章

  • Java相关转化
    Scanner相关操作:参考文章字符串数组转化为int数组Strings=in.nextLine();//获取字符串中的每一个数字.字符串转数组String[]strArr=s.split(",");//创建一个in......
  • [java]-自定义注解
    aop+自定义注解注解基础1.Java注解的描述java注解又叫做java标注,是java的一种注释机制,在jdk5.0引入。其可以作用在类、方法、变量、参数和包上。另外,其可以通过反射来获......
  • [Java]基础篇-对象存储OSS
    商城品牌管理新建品牌管理菜单逆向生成的vue代码复制到vscode工作空间brand.vue页面代码brand-add-or-update.vue添加修改组件代码启动项目:对显示状态进行优化......
  • [java]-超时自动处理
    实现方式1.数据库轮询(30)订单表(订单ID、状态、创建时间)物理、逻辑2.JDK队列DelayedQueue无界阻塞队列​poll()得到超时的元素,如果没有任何元素超时,......
  • [java基础]-反射
    (一)反射:框架设计的灵魂1.反射介绍*框架:半成品软件。可以在框架的基础上进行软件开发,简化编码*反射:将类的各个组成部分封装为其他对象,这就是反射机制 *好处: 1.可以......
  • [java高级]-Stream API说明
    1、StreamAPI说明Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI。StreamAPI(java.util.stream)把真正的函数式编程风格引入到......
  • [java高级]-详解Java8 Collect收集Stream的方法
    1、Collection,Collections,collect,Collector,CollectosCollection是Java集合的祖先接口。Collections是java.util包下的一个工具类,内涵各种处理集合的静态方法。j......
  • [java高级]-强大的Stream API
    1、StreamAPI说明Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI。StreamAPI(java.util.stream)把真正的函数式编程风格引入到......
  • [java-project-gl]单点登录与社交登录
    一、注册登录(一)验证码功能1、注册页面reg.html展示页面:<aid="sendCode">发送验证码</a>reg.html的验证码的相关javascript: $(function(){ $("#sendC......
  • [java]-JWT-什么是JWT-JWT整合sprigboot
    1.什么是JWT?JSONWebToken(JWT)isanopenstandard(RFC7519)thatdefinesacompactandself-containedwayforsecurelytransmittinginformationbetweenpa......