构造方法详解

Posted 双龙路潇洒哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造方法详解相关的知识,希望对你有一定的参考价值。

文章目录:

何为构造方法?构造方法的作用?

构造方法的定义要求

构造方法的重载及重载作用

构造方法的特殊应用:匿名对象

构造方法与this关键字

构造方法与super关键字


何为构造方法?构造方法的作用?

类中存在属性与方法。而方法又分为了普通方法和构造方法。

构造方法是在实例化对象的时候使用,主要功能是完成对象的属性初始化功能。而普通方法则是在实例化对象后使用。

构造方法的定义要求

1.构造方法的名称要和类名一致。

2.构造方法不允许有返回值类型声明。

值得注意的是:

1.如果你未定义构造方法,则类会自动生成一个无参无返回值的构造方法,如下图。

2.如果你定义了构造方法,那么类将不会再提供无参的构造方法,这在子类继承方面很容易出错,下面介绍。

构造方法的重载及重载作用

构造方法也是方法,是方法就可以重载。

重载示例如下:

为什么要重载?

重载可以在实例化对象的同时为对象的属性赋值。

顺带一提,重载构造方法是最好按照参数由少到多规范排列。

构造方法的特殊应用:匿名对象

照例由代码来说明。

package test;

//定义一个类
public class Father {

	private String name;
	private int age;
	
	//无参构造方法
	public Father() {
		
	}
	
	//构造方法重载
	public Father(String name) {
		this.name = name;
	}
	
	//构造方法重载
	public Father(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	//setter、getter方法略
	
	//定义一个普通方法
	public void tell() {
		System.out.println("姓名:" + this.name + ",年龄" + this.age);
	}
}
package test;

//主方法演示
public class JavaDemo {

	public static void main(String[] args) {
		
		//存在栈内存引用指向的对象
		Father firstFather = new Father("张三",18);
		firstFather.tell();
		
		//匿名对象
		new Father("李四",19).tell();

	}

}

如代码所示,普通对象与匿名对象都使用了new关键字在堆内存中开辟了一块空间,但是匿名对象没有栈内存引用指向,所以只能使用这一次,并且使用完了后其堆内存空间成了垃圾空间,等待回收。

构造方法与this关键字

在当前类的构造方法中可以使用this()来调用本类中的其他构造方法也可以用this.方法()来调用本类中的普通方法,就像下图这样。

package test;

public class Father {

	private String name;
	private int age;
	
	public Father() {
		
	}
	
	public Father(String name) {
		this();                            //看这里
        this.name = name;
	}

	public Father(String name,int age) {
		this(name);                        //还有这里
		this.age = age;
	}
	
	//setter、getter方法略

	public void tell() {
		System.out.println("姓名:" + this.name + ",年龄" + this.age);
	}

}

为什么要使用this()来调用其他构造函数?

主要目的是提升构造方法中执行代码的可重用性。没错,就是懒,你要是想自己再写一遍也可以。

值得注意的是:

1.在使用this()时一定要放在方法的首句。

2.本类中未规定一定要使用this()调用其他构造函数。【为什么要专门提这一句,请对比下面的super()】

构造方法与super关键字

观察以下代码,看看有意思的地方。




我调用子类的构造方法来实例化一个儿子,但是父类的构造方法也被调用了!

什么意思呢?就是说子类对象实例化前一定会实例化父类对象,实际上就相当于子类的构造方法中都隐藏着一句super(),当然它也一定要在方法中的第一句(系统偷偷放的)。

所以重点来了!怎么解决这个问题?

1.父类中放一个无参的构造方法(结合上文所学,如果你自己写了有参的构造方法,一定别忘了留一个无参的构造方法。)。

2.如果父类中没有无参的构造方法,那么就咱们就主动点,自己把super()写了,按照你定义的构造方法来写,如super(参数...)。

3.用魔法来打败魔法,我们把第一行给占了,写上this()。但是实际上只不过是把矛盾转移了,本类中的其他构造方法还是得调用父类构造方法。所以啊,至少要保留一个构造方法作为出口,而这个出口一定要去调用父类构造方法。

以上是关于构造方法详解的主要内容,如果未能解决你的问题,请参考以下文章

super详解

创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量。 编写两个构造方法:一个没有(代码片段

详解 Scala 模式匹配

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序

在 Visual Studio 中创建构造函数的代码片段或快捷方式

Golang创建构造函数的方法详解