黑马程序员-学习java的构造器

本文深入讲解了Java中构造器的作用及使用方法,包括构造器如何初始化对象字段、构造器的重载以及如何通过this关键字调用不同的构造器,旨在帮助读者理解并掌握构造器的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

构造器最大的作用就是在创建对象时执行一系列的初始化工作。当创建一个对象时,系统为这个对象的Field进行默认的初始化,这种初始化把所有基本类型的Field设为0(对数值型Field)或false(对布尔型Field),把所有的引用类型的Field设为null。如果在类里面没有为该类提供任何构造器,则java编译程序会为这个类提供一个默认的构造器,这个构造器为空,即什么也不做。

public class A {
	public String name;
	public int count;
	public static void main(String[] args) {
		A a = new A();
		System.out.println("name is :" + a.name);
		System.out.println("count is:" + a.count);
	}	
}
程序输出
name is :null
count is:0

当为类A提供一个显式的构造器时候,就可以在构造器的方法体里面对Field进行初始化工作。

public class A {
	public String name;
	public int count;
	public A(String name, int count){
		this.name = name;
		this.count = count;
	}
	public static void main(String[] args) {
		A a = new A("优快云",10);
		System.out.println("name is :" + a.name);
		System.out.println("count is:" + a.count);
	}	
}
程序输出:
name is :优快云
count is:10

当创建一个对象的时候是通过new后面加上构造器来实现的,构造器表面上没有返回值,但实际上他返回的是当前对象的引用。但这并不是说对象完全是由构造器创建的。实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这时对象已经产生了,这些操作在构造器执行之前就完成。也就是说,当系统开始执行构造器的执行体前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中通过this来引用。当构造器的执行体执行结束后,这个对象作为构造器的返回值被返回,通常还会赋给另一个引用类型的变量,从而让外部程序访问该对象。
Java支持方法的重载,构造器也不例外,构造器的重载允许使用不同的构造方法来初始化不同形式的对象。

public class A {
	public String name;
	public int count;

	public A() {
	}

	public A(String name, int count) {
		this.name = name;
		this.count = count;
	}

	public static void main(String[] args) {
		A a = new A();
		System.out.println("name is :" + a.name);
		System.out.println("count is:" + a.count);
		A a1 = new A("优快云", 10);
		System.out.println("name is :" + a1.name);
		System.out.println("count is:" + a1.count);
	}
}
程序输出
name is :null
count is:0
name is :优快云
count is:10

如果一个类中存在两到三个甚至更多的构造器,并且构造器之中存在着一些关联,本着软件复用的原则,构造器应该这样写:

public class apple {
	public String name;
	public String color;
	public String weight;
	public apple(){}
	public apple(String name,String color){
		this.name = name;
		this.color = color;
	}
	public apple(String name,String color,String weight){
		this(name, color);
		this.weight = weight;
	}
	public static void main(String[] args) {
		apple a1 = new apple("smale apple", "red");
		System.out.println("name:" + a1.name + " color:" + a1.color);
		apple a2 = new apple("big apple","green" , "50g");
		System.out.println("name:" + a2.name + " color:" + a2.color + " weight:" + a2.weight);
	}
}
程序运行结果:
name:smale apple color:red
name:big apple color:green weight:50g

上面的apple类里面包含了三个构造器,其中第三个构造器通过this来调用另一个重载构造器的初始化代码。程序中this(name,color);表明调用该类另一个有两个字符串参数的构造器。使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。使用this调用重载的构造器时,系统会根据this后括号里的实参来调用形参列表与之对应的构造器。
         当然,也可以把第二个构造器里面的代码粘贴到第三个构造器里面去,这样也可以实现功能,而且不用this关键字语法上面也更加的清晰,但是从软件工程的角度来看,这样做是相当的糟糕的。在软件开发里面有一个规则:不要把想同的代码段书写两次以上!因为软件是一个需要不断更新的产品,如果有一天需要更新构造器A的初始化代码,假设构造器B,构造器C等等里面都包含了相同的初始化代码,则需要在构造B,构造器C里面的代码进行修改。反之,如果构造器B,构造器C里面用this关键字来调用了构造器A的初始化代码,则只需要打开构造器A进行修改即可。因此,尽量避免相同的代码重复出现,充分利用没一段代码,既可以让程序代码更加简洁,也可以降低软件的维护成本。
---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

详细请查看:www.itheima.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值