【Java核心技术卷】理解Java的实例构造函数

实例构造方法的注意事项:

1)java的实例构造方法的方法名必须与类名称完全相匹配。
2)无返回类型
3)如果在类中没有定义实例构造方法,系统默认会创造一个无参数的实例构造方法,只要在类中定义自己的实例构造方法,系统便不会再创造参数的实例构造方法
4)super()、this()构造方法调用语句必须是构造方法的第一条语句。

1、自动添加默认的无实现代码的无参实例构造方法

1.1类中如未定义任何实例构造方法,则编译器将自动添加一个默认的无参实例构造方法,该默认的无参实例构造方法无实现代码。

//SuperClass.java
//父类
public class SuperClass {
		public int a;
}

//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译后:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

//编译器添加的默认的无实现代码的无参实例构造方法
		public SuperClass() {
	 		super();
		}
}


		//SubClass.java
//子类
public class SubClass extends SuperClass {

			int b;

			public SubClass() {
	 		super();
				System.out.println("调用子类无参构造方法...");
				b = 30;
			}

			public SubClass(int n) {
	 		super();
				System.out.println("调用子类有参构造方法...");
				b = n;
			}

			public static void main(String[] args) {
				// 实例化一个子类对象
				SubClass obj = new SubClass();
				// 输出子类中的属性值
				System.out.println("a=" + obj.a + ",b=" + obj.b);
			}
}

【Java核心技术卷】理解Java的实例构造函数_第1张图片

1.2 类中如已定义任何实例构造方法,则编译器将不会添加默认实例构造方法。
编译前的源程序:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}

//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译后:编译器不会添加默认的无实现代码的无参实例构造函数

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
		 	super();
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
		 	super();
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}

//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
		 	super();
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
		 	super();
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

运行结果:
【Java核心技术卷】理解Java的实例构造函数_第2张图片

2、自动添加调用超类无参构造方法super()

2.1 超类有无参构造方法
如果子类的构造方法没有显示地调用超类的构造方法super(…)、本类的构造方法this(…),则编译器将在子类构造方法的第一条语句自动添加调用超类无参构造方法super()语句。

编译前的源程序:超类有无参构造方法

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译后:如果子类的构造方法没有显示地调用超类的构造方法super(…)、本类的构造方法this(…),则编译器将在子类构造方法的第一条语句自动添加调用超类默认构造器super();

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
		 	super();
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
		 	super();
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}



//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
		 	super();
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
		 	super();
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

运行结果
【Java核心技术卷】理解Java的实例构造函数_第3张图片
2.2 超类没有无参构造方法

编译前的源程序:超类没有无参构造方法

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass(int m) {
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译错误:因为子类的构造方法中要自动添加super(); 语句,但是超类中没有无参构造方法可以用来调用。
运行结果:
【Java核心技术卷】理解Java的实例构造函数_第4张图片

3、在子类构造方法中,使用super(…)调用超类构造方法的语句必须是子类构造方法的第一条语句。

编译前的源程序:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			super(20);
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			super(20);
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译后:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
		 	super();
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
		 	super();
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
		 	super(20);
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
		 	super(20);
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

运行结果:
【Java核心技术卷】理解Java的实例构造函数_第5张图片

4、 在本类构造器中,使用this(…)调用本类其它构造器的语句必须是本类构造器的第一条语句。

编译前的源程序:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
			this(40);
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
			super(20);
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

编译器编译后:

//SuperClass.java
//父类
public class SuperClass {
		public int a;

		public SuperClass() {
		 	super();
			System.out.println("调用父类无参构造方法...");
			a = 10;
		}

		public SuperClass(int m) {
		 	super();
			System.out.println("调用父类有参构造方法...");
			a = m;
		}
}


//SubClass.java
//子类
public class SubClass extends SuperClass {

		int b;

		public SubClass() {
		 	this(40);
			System.out.println("调用子类无参构造方法...");
			b = 30;
		}

		public SubClass(int n) {
		 	super(20);
			System.out.println("调用子类有参构造方法...");
			b = n;
		}

		public static void main(String[] args) {
			// 实例化一个子类对象
			SubClass obj = new SubClass();
			// 输出子类中的属性值
			System.out.println("a=" + obj.a + ",b=" + obj.b);
		}
}

运行结果:
【Java核心技术卷】理解Java的实例构造函数_第6张图片

5、实例构造方法的调用过程

SubClass (…) --> SuperClass (…) --> Object(…)
即构造方法的执行顺序:先执行Object(…)构造方法,再执行SuperClass (…) 构造方法,最后执行SubClass (…) 构造方法。

你可能感兴趣的:(Java核心技术)