章节三、7-构造方法
新建第一个类StructureCar:
package introduction; public class StructureCar { private String make; public void setMake(String make) { this.make = make; } public String getMake() { return make; } }
新建第二个类ConstructorDemo:
package introduction; public class ConstructorDemo { public static void main(String[] args) { //当创建这个对象时,就是调用了car这个类里面空参数构造函数给这个对象进行初始化 StructureCar c1 = new StructureCar(); c1.setMake("Auto"); System.out.println(c1.getMake()); } }
一、构造函数专门用于初始化对象。
二、每个类在创建后都默认有一个空参数的构造函数,构造函数中默认有return语句,用于结束函数。
三、怎样新建一个构造函数:
package introduction; public class StructureCar { /* * 构造函数歌手: * 1、函数名和类名相同 * 2、没有返回值类型 * 3、没有具体的返回值 */ private String make; //这是一个构造函数 public StructureCar() { } public void setMake(String make) { this.make = make; } public String getMake() { return make; } }
四、一个类中允许存在多个构造函数,同名不同参(参数的个数和类型不同)。
五、方法名相同,参数列表不同的方法我们可以称之为重载。
六、重新新建两个变量,并在构造函数中对他们进行初始package introduction;public class StructureCar {
/* * 构造函数歌手: * 1、函数名和类名相同 * 2、没有返回值类型 * 3、没有具体的返回值 */ private String make; int year; int speed; //这是一个构造函数 public StructureCar() { this.year = 2000; this.speed = 1990;
//体现已经调用了这个构造方法
System.out.println("空参构造函数"); } public void setMake(String make) { this.make = make; } public String getMake() { return make; } }
在ConstructorDemo类中打印刚刚加上的两个变量:
package introduction; public class ConstructorDemo { public static void main(String[] args) { //当创建这个对象时,就是调用了car这个类里面空参数构造函数给这个对象进行初始化 StructureCar c1 = new StructureCar(); System.out.println(c1.speed); System.out.println(c1.year); } }
打印结果为:
从打印结果中我们可以看到“空参构造函数”打印在变量“year、speed”之前,因为我们在创建“c1”对象时“空参构造函数”就已经执行了,同时还给变量“year、speed”进行了初始化赋值,但是在打印结果中我们可以看到“空参构造函数”比变量的赋值结果先打印在显示栏中,其实在对象建立时这些都已经赋值完成了,只不过在其它类中打印变量的语句在对象建立之后才执行,所以我们看到的打印结果才会出现这种现象。
七、如果我们想创建对象时变量就能够按照自己的要求被初始化,那么我们创建一个带参数的构造函数:
package introduction; public class StructureCar { /* * 构造函数歌手: * 1、函数名和类名相同 * 2、没有返回值类型 * 3、没有具体的返回值 */ private String make; int year; int speed; //这是一个构造函数 public StructureCar() { this.year = 2000; this.speed = 1990; //体现已经调用了这个构造方法 System.out.println("空参构造函数"); } /* * 这个构造函数和上面的构造函数不同之处: * 上面的构造函数year、speed变量是固定的,创建完对象后,对象的初始化值都是“0”, * 而下面这种构造函数在创建对象时就可以按照自己的意愿给year、speed变量传值 */ public StructureCar(int year,int speed) { this.year = year; this.speed = speed; } public void setMake(String make) { this.make = make; } public String getMake() { return make; } }
在ConstructorDemo类中进行调用打印:
package introduction; public class ConstructorDemo { public static void main(String[] args) { //当创建这个对象时,就是调用了car这个类里面空参数构造函数给这个对象进行初始化 StructureCar c1 = new StructureCar(); System.out.println(c1.speed); System.out.println(c1.year); System.out.println("---------分割线---------"); //创建对象时进行初始化 StructureCar c2 = new StructureCar(2018,120); System.out.println(c2.speed); System.out.println(c2.year); } }
结果为:
八、在构造方法内部调用构造方法(构造函数调用构造函数):
调用的格式:this();
package introduction; public class StructureCar { /* * 构造函数歌手: * 1、函数名和类名相同 * 2、没有返回值类型 * 3、没有具体的返回值 */ private String make; int year; int speed; //这是一个构造函数 public StructureCar() {
//调用带参的构造函数
this(2100,1880); //this.year = 2000; //this.speed = 1990; //体现已经调用了这个构造方法 System.out.println("空参构造函数"); } /* * 这个构造函数和上面的构造函数不同之处: * 上面的构造函数year、speed变量是固定的,创建完对象后,对象的初始化值都是“0”, * 而下面这种构造函数在创建对象时就可以按照自己的意愿给year、speed变量传值 */ public StructureCar(int year,int speed) { this.year = year; this.speed = speed; } public void setMake(String make) { this.make = make; } public String getMake() { return make; } }
在ConstructorDemo类中进行调用打印:
public class ConstructorDemo {
public static void main(String[] args) {
//当创建这个对象时,就是调用了car这个类里面空参数构造函数给这个对象进行初始化
StructureCar c1 = new StructureCar();
System.out.println(c1.speed);
System.out.println(c1.year);
}
}
结果为:
注意:调用时被调用的构造函数必须放在调用的构造方法的第一行,否则会报错
正确(如下所示必须放在第二行,否则会报错):
1 public StructureCar() { 2 this(2100,1880); 3 this.year = 2000; 4 this.speed = 1990; 5 //体现已经调用了这个构造方法 6 System.out.println("空参构造函数"); 7 }
错误:
九、构造方法和普通方法的区别:
1、运行上:
构造函数在创建对象时就已经执行,只执行一次。
在对象创建后,需要时才被调用,能够调用多次。
2、构造函数在类中是以重载形式来体现,方法名一样,参数列表不一样。
3、如果在一个类中,如果自定义了一个构造函数,默认的构造函数就不存在了