写"构造方法"常忽略的细节
一、构造方法的概念:
- 构造方法的方法名就是类名.
- 构造方法没有返回值类型,连 ''void" 也没有,写了返回值类型的就不是构造方法,而是成员方法.
- 一个类中一定有构造方法,如果不写的话,系统自动添加无参构造方法,抽象方法方法有构造方法,而接口一定没有,因为接口不允许被实例化.
- 构造方法是给对象初始化的使用的,.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用.
- 构造方法分为带参构造方法和无参构造方法(或默认构造方法),与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性.
- 构造方法对构造出来个一个类的实例(对象)初始化,主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的.
二、创建对象的执行步骤
入门的程序员建议先看"注意事项"再回来看"执行步骤".
继承体系中,子类被实例化的时候,首先调用相对应的父类构造方法 ,然后在调用子类对应的构造方法,然后将参数传入构造方法中,这时候父类的 “age” 属性拿到age,因为子类继承了父类中的age,然后父类的age传入子类中的构造方法的参数中,再给对象进行赋值.
注意: 在子类中,构造方法中的age遵循就近原则,拿到的是父类的age值而不是子类中的age值.
public class Demo1 {
int age;
public Demo1() {
}
public Demo1(int age) {
System.out.println("Demo1带参方法被子类调用");
}
}
public class Demo2 extends Demo1 {
int age=20;
public Demo2(int age) {
super(age);
System.out.println("子类带参构造方法执行了...");
System.out.println(age);
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2(10);
/*
* 执行结果:
* Demo1带参方法被子类调用
* 子类带参构造方法执行了...
* 10
*/
}
}
三、注意事项
- 构造不能被static、final、synchronized、abstract和native修饰.
- 构造方法可以被私有化,但私有化后的构造方法只能在本类中被实例化.代码如下:
public class Demo1 {
private Demo1() {
System.out.println("本类对象已经被创建...");
}
public static void main(String[] args) {
//创建本类对象
Demo1 d = new Demo1(); // 本类对象已经被创建...
}
}
读者可以试试不在本类中写main方法,另外写一个demo创建Demo1的对象,看看能否创建成功. 这里先告诉大家一定是不能创建的,会报错.
- 在继承体系中,如果类中的空参构造方法被私有化并且没有带参构造方法,是不能有子类的.如果有类去继承被私有化的类,编译一定护=会出错.但类中的空参构造方法被私有化但有带参构造方法,子类不能有空参构造方法,必须也是带参的构造方法,
不能存在空参构造方法.
代码如下:
public class Demo1 {
int age;
private Demo1() {
System.out.println("本类对象已经被创建...");
}
public Demo1(int age) {
}
}
public class Demo2 extends Demo1 {
public Demo2(int age) {
super(age);
}
}
如果父类中只有带参的构造方法,子类也必须是带参构造方法,不能创建空参构造方法.代码如下:
public class Demo1 {
int age;
public Demo1(int age) {
System.out.println("Demo1带参方法被子类调用");
}
}
public class Demo2 extends Demo1 {
public Demo2(int age) {
super(age);
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2(10);//Demo1带参方法被子类调用
}
}
上述代码并且证明,子类在被实例化的同时会调用父类的构造方法去创建对象.
注意: (1)如果父类有空参构造方法和带参构造方法,子被实例化的时候不传入参数,那么子类就只会调用父类的空参构造方法;
(2)如果子被实例化的时候传入了参数,那么子类就只会调用父类的带参构造方法.
说明: 子类被实例化的时候系统会自动匹配相对应的构造方法去创建对象.