朝花夕拾——你了解构造器初始化顺序吗?

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在java程序中,创建java对象,其初始化顺序总是先调用最顶层父类的初始化操作,包括初始化块和构造器,然后再向下调用其他类的初始化操作。

类和实例的初始化顺序可以参考

朝花夕拾——看清java实例变量的初始化内幕

朝花夕拾——再看java类变量的初始化内幕

先看看代码例子

package java_zhaohuaxishi;

class GrandFather{
	
	{
		System.out.println("GrandFather--非静态代码块");
	}
	
	public GrandFather(){
		System.out.println("GrandFather--无参构造器");
	}
	
	public GrandFather(String name){
		this();
		System.out.println("GrandFather--有参构造器"+"名字:"+name);
	}
}

class Father extends GrandFather{
	
	{
		System.out.println("Father--非静态代码块");
	}
	
	
	public Father(){
		System.out.println("Father--无参构造器");
	}
	
	public Father(String name){		
		super(name);
		System.out.println("Father--有参构造器"+"名字:"+name);
	}
	
}

class Son extends Father{
	
	{
		System.out.println("Son--非静态代码块");
	}
	
	
	public Son(){
		super("向上");
		System.out.println("Son--无惨构造器");
	}

	public Son(String name) {
		this();
		System.out.println("Son--有参构造器"+"名字:"+name);
	}
	
}

public class ConstructorTest {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Son("小明");

	}

}
程序运行结果如下

GrandFather--非静态代码块
GrandFather--无参构造器
GrandFather--有参构造器名字:向上
Father--非静态代码块
Father--有参构造器名字:向上
Son--非静态代码块
Son--无惨构造器
Son--有参构造器名字:小明

从上述结果看到,构造器的初始化过程实际上会根据具体调用this或者super的方法来进行,是一个递归操作。

构造器使用super显式调用的是父类的构造器,再根据具体的参数执行父类的具体构造器;而this也是显示调用本类的构造器,也会根据参数来执行。

然而,当子类构造器中没有显示使用super和this的话,则会在子类构造器执行之前隐式调用父类无参构造器。

我把上述代码中

	public Son(){
		//super("向上");
		System.out.println("Son--无惨构造器");
	}
super带参调用注释掉,则输出结果如下:

GrandFather--非静态代码块
GrandFather--无参构造器
Father--非静态代码块
Father--无参构造器
Son--非静态代码块
Son--无惨构造器
Son--有参构造器名字:小明
值得注意的是:super和this的调用必须作为构造器第一行代码,且最多只能选其中一种来进行调用。






构造器初始化 案例一: //构造器初始化 public class OrderInitial { public static void main(String[] args) { //new对象时,先执行构造器,按顺序执行 House h = new House(); h.f(); } } class window{ window(int market){ System.out.println(“window... 阅读详情

相关推荐

【创建初始化对象和构造器详解】

注意点:定义有参后,如果想使用无参,要示定义一个无参的构造。快捷键:alt + insert (有参构造和无参构造)new 本质在调用构造方法。

qq_62413000的博客 404

构造器初始化

可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动作来确定初值,这为编程带来了更大的灵活性。但要牢记:[b]无法阻止自动初始化的进行,它将在构造器被调用之前发生[/b]。例如下述代码: [code="java"]public class Counter{ int i; Counter(){ i = 7; } //...... }[/code] 那么i首先会被置为0,然...

千里之行,始于足下 304

深入构造器(1):使用构造器执行初始化

前言:构造器是一个特殊的方法,它主要的作用是在实例化对象的时候,进行对象初始化构造器是创建对象的重要途径(即使使用工厂模、反射等方创建对象,其实质依然是依赖于构造器),因此, Java 类必须包含—个或一个以上的构造器。篇2:构造器的重载与相互调用 1、构造器的作用 ​ 构造器最大的用处就是在创建对象时执行初始化。前言中已经介绍过了,当创建一个对象时,系统为这个对象的实例变量进行默认初始化,这种默认的初始化把所有基本类型的实例变最设为默认值,如下表所示: 数据类型 默认初始化

Love what you do 1871

Java 构造器详解:从基础语法到高级用法,掌握对象初始化的艺术

摘要:Java构造器是类实例化的核心机制,用于对象初始化。本文系统讲解构造器的定义、语法、特性及使用技巧,包括构造器重载、默认构造器、this()调用等核心概念。通过代码示例分析构造器与方法的区别,探讨其在设计模中的应用,并提供最佳实践建议。文章还列举常见错误和注意事项,帮助开发者编写更安全可靠的对象初始化逻辑,适合Java初学者系统学习或开发者回顾核心知识。(147字)

weixin_73962764的博客 1482

朝花夕拾——再看java类变量的初始化内幕

前面理解过java实例变量的初始化规则 朝花夕拾——看清java实例变量的初始化内幕 今天继续理清类变量的初始化顺序和细节,需要的朋友可以一起温习下。 类变量的初始化和实例变量的初始化很相似,相比实例变量初始化,少了构造器初始化的情况。大致只有:定义类变量时初始化和静态块中初始化两种情况。 规则:上述两种情况下,先对所有类变量进行申明并申请内存,在把赋值操作全部移动到静态块中进行初始化顺序

「Android之禅」公众号博主,和你分享有价值有思考的技术文章 2139

朝花夕拾——看清java实例变量的初始化内幕

过一段时间可能就得去找实习,今天在宿舍翻开以前常放在枕头边的大砖头《Java编程思想》打算重温下之前学的知识点,看到有关java初始化的一些知识,综合之前看过的网页和书籍,记下自己对java实例变量初始化的理解,仅供需要的朋友参考,也为自己积累一些java编程应该注意的知识点。     java中对实例变量的初始化可以在三个地方出现:定义实例变量时指定初始值;初始化块中为实例变量指定的初始值;构

「Android之禅」公众号博主,和你分享有价值有思考的技术文章 1966

朝花夕拾——this和super到底是引用还是对象?

Java构造器初始化的构成中经常会使用到this和super关键词,那么他们到底是特定类的引用还是对象呢?下面我们逐步看清他们的真实面目。 先看例子1——这个this到底是什么类型,又是谁的对象? package java_zhaohuaxishi; class Father{ private String name = "父亲"; public Father(){

「Android之禅」公众号博主,和你分享有价值有思考的技术文章 3408

07、构造器 (constructor) -- 初始化成员变量

在创建对象时,被JVM自动调用的特殊方法。注意:构造器不能被继承不能被重写、可以被重载。2、声明构造器的语法【修饰符】构造器名(多个形参声明) {// 0~N 条可执行的语句。【修饰符】 – 可以省略。还可以是 public | protected | private。构造器名称 –不能省略。必须与类名相同。形参声明 –形参名满足首字母小写 + 驼峰标识。多个形参声明之间用英文逗号隔开。

butingdejiaobu的专栏 847

Java的无参构造函数

一点睛 1 如果一个类没有定义任何构造函数,那么该类会自动生成1个默认的构造函数。默认构造函数没有参数。 2 如果一个类定义了构造函数,但这些构造函数都有参数,那么不会生成默认构造函数,也就是说此时类没有无参的构造函数。 通过两个例子来说明。 二使用无参构造函数的错误 1代码 public class ConstructWithNoPara { public stati...

实践求真知 3万+

02 构造器初始化

在类中变量定义的顺序决定了它们初始化顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。即:变量的初始化与该变量在类中定义的先后顺序相关(暂不理会静态变量),但是都会在方法被调用前初始化

A2460865183的博客 179

构造器初始化_02

无法阻止初始化的自动进行,它将在构造器被调用之前发生。 变量定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义之间,它仍旧会在任何方法(包括构造器)之前得到初始化。 import static net.mindview.util.Print.*; // When the constructor is called to create a // Window object, you'

u013256831的专栏 825

Java构造方法的初始化顺序

一、构造函数初始化顺序理论     当一个对象被创建时,初始化是按照下面的顺序完成的。 设置成员的值为默认的初始值(0,false,null). 调用对象的构造方法(但是还没有执行构造方法体) 调用父类的构造方法 使用初始化程序的初始块和初始化成员 执行构造方法体     验证代码如下: public class A { public A() { System....

ykizz的博客 5845

Java初始化与清理 - 用构造器确保初始化

构造器是一个创建对象时被自动调用的特殊方法,为的是初始化构造器的名称应与类的名称一致。        当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null.        构造器可以改变这种默认的初始化。 package com; public class Practice { St

程序猿开发日志【学习永无止境】 766

构造方法可以有返回值吗_一篇文章带你了解Java构造方法的定义和重载

一、构造方法的定义(一)什么构造方法实例化一个类的对象后,如果要给属性赋值,需要通过访问对象的属性或setXXX()方法。在实例化对象后同时给对象的属性赋值可以使用构造方法,构造方法也叫做构造函数。用来对对象进行初始化。(二)构造方法特点1.构造方法的名字必须和类名完全相同。2.方法名前面没有返回值,甚至连表示没有返回值的空类型(void)也没有。3.在方法中不能使用return语句返回一个值。4...

weixin_39732716的博客 2700
上一篇: 最近微信上很火的小游戏【壹秒】android版——开发分享
下一篇: 朝花夕拾——this和super到底是引用还是对象?
Android之禅
博客等级 码龄13年 135粉丝 78原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值