构造器的执行顺序
1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果
是无参则执行的是无参构造器,如果执行的是有参则执行的有参构造器)
现在的父类中只有两个构造器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | Father.java Father { public Father(){ System.out.println( "我是父类的无参构造器" ); } public Father(String username){ System.out.println( "我是父类有参构造器,传过来的参数是+" +username); } public class SonDemo extends Father{ public SonDemo(){ System.out.println( "我是--子类--的无参构造器" ); } public SonDemo(String username){ System.out.println( "我是子类的有参构造器,参数是" +username); } public void sys(){ System.out.println( "我是子类的sys方法" ); } public static void main(String[] args) { //里面的内容在下面有说明 } } |
①,子类使用无参构造器创建对象:
在SonDemo 的main方法中加入创建对象的代码:
1 2 3 | SonDemo son = new SonDemo(); } |
我是父类的无参构造器
我是--子类--的无参构造器
②,子类使用有参构造器创建对象:
SonDemo的main方法中加入
1 | SonDemo son = new SonDemo( "than you ma" ); |
那么控制台打印的结果是:
我是父类的无参构造器
我是子类的有参构造器,参数是than you ma
也就是说在子类调用无参构造器创建对象的时候,在执行它自己的有参构造器之前首先执行父类的无参构造器。
③,在子类中创建父类的对象,使用无参,
1 2 | SonDemo son = new SonDemo( "than you ma" ); Father ff = new Father(); |
SonDemo的main方法中加入
我是父类的无参构造器
我是--子类--的无参构造器
我是父类的无参构造器
调用了父类的无参构造器,有参的创建对象调用的是有参构造器。
总结:在创建子类对象的时候,首先会调用父类的构造器,让后在调用子类相应的构造器创建对象,在子类创建父类对象时,就是直接调用父类自己相应的构造器。
2.如果在子类和父类中存在静态块;执行顺序有会是怎么样的了?
答,静态块会在构造器之前运行。不管是子类还是父类。创建一个对象的时候,会首先加载它的静态块。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | Father.java public class Father { //静态块 static { System.out.println( "father static " ); } public Father(){ System.out.println( "我是父类的无参构造器" ); } public Father(String username){ System.out.println( "我是父类有参构造器,传过来的参数是+" +username); } } SonDemo.java public class SonDemo extends Father{ //静态块 static { System.out.println( "sonDemo static " ); } public SonDemo(){ System.out.println( "我是--子类--的无参构造器" ); } public SonDemo(String username){ System.out.println( "我是子类的有参构造器,参数是" +username); } public void sys(){ System.out.println( "我是子类的sys方法" ); } public static void main(String[] args) { SonDemo son = new SonDemo(); } } |
①程序的结果:
father static
sonDemo static
我是父类的无参构造器
我是--子类--的无参构造器
因为在创建子类对象之前:会创建父类的一个对象,而静态块会在main之前被加载,
所以两个类的静态块首先执行。
然后执行构造器。
②,如果在子类中的main中只创建父类的对象结果是怎么样的呢?
打印结果:
father static
sonDemo static
我是父类的无参构造器
为什么子类的静态块会被加载了?是因为我们是在
SonDemo中测试,如果在其他类中测试就不会打印。
总结:我们说了这么多就是重要的一点。静态块会在构造器器之前执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)