属性赋值的先后顺序

本文解析了Java中属性赋值的顺序,包括默认初始化、显示初始化、构造器中初始化以及后期通过方法或属性的动态设置。重点介绍了这四个阶段的执行顺序和实际应用中的注意事项。

属性赋值的先后顺序


package com.atguigu.java1;
/*
 * 总结 : 属性赋值的先后顺序
 * 
 * 1.默认初始化
 * 2.显示初始化
 * 3.构造器中初始化  以上三点属于初始化  在程序中,只能执行一次
 * 
 * 4.通过 对象.方法 或 对象.属性 的方式赋值   这个可以反复调用执行
 * 
 * 以上操作的先后顺序:1 - 2 - 3 - 4
 * 在实际中,从后往前看
 * 
 */
public class UserTest
{
	public static void main(String[] args)
	{
		User u = new User();
		
		System.out.println(u.age);//0  1
		
		User u1 = new User(2);
		
		u1.setAge(3);
		
		System.out.println(u1.age);//2//3
	}
}

class User{
	String name;
	int age = 1;
	
	public User() {
		
	}
	public User(int a) {
		age =a ;
	}
	public void setAge(int a) {
		age = a;
	}	
}

### Java 构造函数初始化顺序解析 在Java中,构造函数用于对象的初始化。当创建一个新的对象实例时,按照特定的顺序来执行一系列操作以确保对象被正确初始化。 #### 静态变量与静态代码块 首先被执行的是类级别的静态成员变量赋值语句以及静态代码块。这些部分在整个程序运行期间只会加载一次,并且是在第一次使用该类前完成初始化[^2]。 #### 父类构造过程 接着,在子类任何其他逻辑发生之前,会先处理其父类的相关构造流程。这意味着即便开发者未显式写出`super()`调用来启动这一机制,编译器也会自动插入这条指令作为子类构造方法的第一条命令去触发超类(即父类)相应版本的方法调用[^3]。 #### 成员变量声明及其初始值设定 随后是当前类内部定义的所有字段(属性),它们会被赋予各自指定的数据类型默认值或者是程序员自定的初值表达式的结果;此阶段还包括非静态域内含有的任意数量的实例初始化区块——也叫做“初始化块”,这类特殊结构会在每次新实体诞生之际早于常规构造器主体内容而先行运作起来[^1]。 #### 子类自身的构造函数体 最后才是用户所编写的具体构造函数内的具体实现细节得以展开并最终形成完整的对象状态配置。这一步骤可能涉及更多复杂的业务逻辑设置或是依赖注入等高级特性应用。 ```java class Parent { public Parent() { System.out.println("Parent constructor"); } } class Child extends Parent { // Static initialization block runs first when the class is loaded. static { System.out.println("Child static init block"); } // Instance initialization block runs before constructors. { System.out.println("Child instance init block"); } public Child(){ super(); // Implicitly called by compiler if not specified explicitly. System.out.println("Child constructor"); } } ``` 上述代码展示了典型的继承关系下各组件之间的相对位置及相应的打印输出次序,可以直观地帮助理解整个初始化过程中各个组成部分是如何协同工作的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值