this调用构造器

本文详细解释了在Java类的构造器中使用`this(形参列表)`调用其他构造器的方法,探讨了其使用规则、限制及示例。特别强调了不能在构造器内部直接调用自身、最多一个`this`调用以及构造器数量对`this`调用次数的影响。

 this调用构造器

① 我们在类的构造器中,可以显式的使用"this(形参列表)"方式,调用本类中指定的其他构造器

② 构造器中不能通过"this(形参列表)"方式调用自己

③ 如果一个类中有n个构造器,则最多有 n - 1构造器中使用了"this(形参列表)"

④ 规定:"this(形参列表)"必须声明在当前构造器的首行

⑤ 构造器内部,最多只能声明一个"this(形参列表)",用来调用其他的构造器

 

package exer;

public class PersonTest {
	public static void main(String[] args) {
		
		Person p1 = new Person();
		System.out.println("*****************");
		p1.setAge(1);
		System.out.println(p1.getAge());
		System.out.println("*****************");
		
		p1.eat();
		
		System.out.println("*****************");
		
		Person p2 = new Person("Jerry",20);
		System.out.println(p2.getAge());
		System.out.println(p2.getName());
		
	}
}

class Person{
	
	private String name;
	private int age;
	
	
	public Person(){
		
//		this.eat();
		String info = "Person初始化时,需要考虑如下的1,2,3,4...(共40行代码)";
		System.out.println(info);
	}
	
	public Person(String name){
		this();
		this.name = name;
		
	}
	
	public Person(int age){
		this();
		this.age = age;
		
	}
	
	public Person(String name,int age){
		this(age);
		this.name = name;
		//this.age = age;
		//Person初始化时,需要考虑如下的1,2,3,4...(共40行代码)
	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return this.name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return this.age;
	}
	
	public void eat(){
		System.out.println("人吃饭");
		this.study();	//调用study()方法
	}
	public void study(){
		System.out.println("人学习");
	}
	
}

 

在Java的继承机制中,子类构造器对父类构造器调用规则具有明确的规范。以下是详细的解释: 当定义一个子类时,其构造器默认会调用父类的无参构造器(即`super()`)。这种隐式的调用确保父类的成员变量能够被正确初始化,从而保障对象状态的完整性[^4]。如果父类没有显式的无参构造器,那么子类的构造器必须显式地使用`super(...)`调用父类的某个构造器,并传递适当的参数。否则,编译器将报错[^3]。 此外,`super(...)`的调用必须是子类构造器中的第一条语句。这是因为在构造子类对象时,必须首先完成父类对象的构造,以确保父类中的初始化逻辑优先执行[^1]。 关于是否必须调用`super()`的问题,正确的描述如下: - 如果父类有无参构造器且子类构造器未显式调用`super(...)`,则编译器会自动插入对父类无参构造器调用。 - 如果父类没有无参构造器,那么子类构造器必须显式调用`super(...)`来调用父类中的某个构造器。 - 在静态上下文中(例如静态方法或静态代码块)不能使用`super`,因为`super`引用的是对象实例的父类部分,而静态成员并不属于任何实例[^2]。 以下是一个示例,展示子类构造器中显式调用父类构造器的情况: ```java class Animal { public Animal(String name) { System.out.println("父类构造器调用,名称:" + name); } } class Dog extends Animal { public Dog(String name, String breed) { super(name); // 显式调用父类构造器 System.out.println("子类构造器调用,品种:" + breed); } } ``` 运行以下代码: ```java public class Test { public static void main(String[] args) { Dog dog = new Dog("Buddy", "Golden Retriever"); } } ``` 输出结果将是: ``` 父类构造器调用,名称:Buddy 子类构造器调用,品种:Golden Retriever ``` 这个例子表明,子类构造器通过`super(name)`显式调用了父类构造器,并传递了必要的参数。 ### 总结 子类构造器是否必须调用`super()`取决于父类是否有无参构造器。若父类没有无参构造器,则子类构造器必须显式调用`super(...)`。此外,`super(...)`的调用必须是子类构造器的第一条语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值