java中构造方法和构造函数难道不是同一个东西吗?

本文详细介绍了Java中的构造方法,包括重载构造方法以实现不同初始化行为,理解默认构造方法的生成规则,子类如何通过super调用父类构造方法,构造方法的作用域和访问级别,以及为何将构造方法设置为private的情况。文章通过实例解释了构造方法的关键概念,有助于深入理解Java对象初始化过程。
摘要由CSDN通过智能技术生成


重载构造方法 、默认构造方法、子类调用父类的构造方法、构造方法的作用域、构造方法的访问级别

在多数情况下,初始化一个对象的最终步骤是去调用这个对象的构造方法。构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。构造方法必须满足以下语法规则:

(1) 方法名必须与类名相同。

(2)不要声明返回类型。

(3)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承,所以用final和abstract修饰没有意义。构造方法用于初始化一个新建的对象,所以用static修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,因此用synchronized修饰没有必要。此外,Java语言不支持native类型的构造方法。

在以下Sample类中,具有int返回类型的Sample(int x)方法只是个普通的实例方法,不能作为构造方法:

public class Sample {
	private int x;

	public Sample()                 /* 不带参数的构造方法 */
	{
		this(1);
	}


	public Sample( int x )          /* 带参数的构造方法 */
	{
		this.x = x;
	}


	public int Sample( int x )      /*不是构造方法 */
	{
		return(x++);
	}
}

以上例子尽管能编译通过,但是把实例方法和构造方法同名,不是好的编程习惯,容易引起混淆。例如以下Mystery类的Mystery()方法有void返回类型,因此是普通的实例方法:

public class Mystery {
	private String s;

	public void Mystery() /*不是构造方法 */
	{
		s = "constructor";
	}


	void go()
	{
		System.out.println( s );
	}


	public static void main( String[] args )
	{
		Mystery m = new Mystery();

		m.go();
	}
}

以上程序的打印结果为null。因为用new语句创建Mystery实例时,调用的是Mystery类的默认构造方法,而不是以上有void返回类型的Mystery()方法。

一、重载构造方法

当通过new语句创建一个对象时,在不同的条件下,对象可能会有不同的初始化行为。例如对于公司新进来的一个雇员,在一开始的时候,有可能他的姓名和年龄是未知的,也有可能仅仅他的姓名是已知的,也有可能姓名和年龄都是已知的。如果姓名是未知的,就暂且把姓名设为"无名氏",如果年龄是未知的,就暂且把年龄设为-1。

可通过重载构造方法来表达对象的多种初始化行为。以下例程的Employee类的构造方法有三种重载形式。在一个类的多个构造方法中,可能会出现一些重复操作。为了提高代码的可重用性,Java语言允许在一个构造方法中,用this语句来调用另一个构造方法。

例程 Employee.java

public class Employee {
	private String name;

	private int age;

/** 当雇员的姓名和年龄都已知,就调用此构造方法 */

	public Employee( String name, int age )
	{
		this.name = name;

		this.age = age;
	}


/** 当雇员的姓名已知而年龄未知,就调用此构造方法 */

	public Employee( String name )
	{
		this(name, -1);
	}


/** 当雇员的姓名和年龄都未知,就调用此构造方法 */

	public Employee()
	{
		this("无名氏");
	}


	public void setName( String name )
	{
		this.name = name;
	}


	public String getName()
	{
		return(name);
	}


	public void setAge( int age )
	{
		this.age = age;
	}


	public int getAge()
	{
		return(age);
	}
}

以下程序分别通过三个构造方法创建了三个Employee对象:

Employee zhangsan=new Employee(“张三”,25);

Employee lisi=new Employee(“李四”);

Employee someone=new Employee();

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值