[java-基础]-Java构造方法的执行顺序
(一)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)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。
(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的构造方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-03-08 urllib登录的cookie复制到headers,模拟登录人人网
2020-03-08 urllib中的保存cookie使用,运用cookiejar来模拟登录人人网
2020-03-08 urllib中的cookie使用,四种方法
2020-03-08 urllib中的https使用,导入ssl模块
2020-03-08 urllib判断重定向
2020-03-08 urllib中的down,下载百度图片为例
2020-03-08 urllib中的本地代理设置