构造方法又称为构造函数,在调用时候必须配合关键字new,是不能被单独调用的。
修饰符 方法名(参数列表){...}
例如:
public Truck(){
//初始代码;
}
注意:方法名与类名相同;构造方法不能有返回值。构造方法只能在对象实例化的时候被调用。构造器本身是一个比较特殊的方法,方法名就是类名,没有返回值(与void还是有区别的),构造器是类创建对象的唯一途径。
若没有显示的给一个类定义构造方法,则编译时则会给该类添加一个默认的构造方法。这时的构造方法是无参的。一个类中可以有多个构造方法(重载),当有指定的构造方法,无论是有参还是无参,系统都不会自动添加无参的构造方法了。
有参的构造方法:通过参数传递来为成员变量初始化。
public Game(String brand,String color,int maxSpeed){
brand=brand;
color=color;
maxSpeed=maxSpeed;
}
按照上述代码来写有参的构造函数,实例化输出时,结果是有问题的,如下:
Game game=new Game("奔驰","黑色",300);
game.toString();
//输出结果
Game{brand='null', color='null', maxSpeed=0}
原因:
代码的逻辑遵循了一种就近原则--赋值过程中优先去找同一作用范围内的成员进行赋值操作。只有找不到的情况下才会扩大作用范围,去类里面找。通俗来讲,上面的只是将参数的值重新覆盖了一遍,并没有按照我们想要的那样给成员变量进行赋值。
两种修改方法--1,修改参数名(避免和成员变量同名)2,用this.属性名=参数名。(后续再细说this指针)
构造方法重载
public class Game {
String brand;
String color;
int maxSpeed;
public Game(String a){}
public Game(String a,String b){}
public Game(String a,String b,int c){}
}
构造器总结:
- 在栈内存中,会存储对象名, 在没有执行构造器创建对象并赋值时,此时对象名对应的值应为null
- 通过new关键字调用类的构造器在堆内存中分配了一块对象区域;
- 通过赋值运算符 = ,将堆内存中的对象地址赋给栈内存中的变量名;
- 例如再次给对象的属性赋值: 通过栈内存中的地址定位到对象在堆内存中的地址,找到相应的成员变量,进行一个赋值操作
this关键字
Java中使用this关键字,指向调用该方法的当前对象。根据this所在的位置,可以分两种
- 出现在构造器中:引用该构造器正在初始化的对象
- 出现在普通方法中:正在调用该方法的对象(成员方法、成员变量)
this用在类的定义中,获取当前对象的属性或者调用当前对象的方法。
public Game(String brand,String color,int maxSpeed){
this.brand=brand;//this代表对象,只有对象才能调用成员属性和方法
this.color=color;
this.maxSpeed=maxSpeed;
}
this是可以省略的。
- Java允许对象的一个成员直接调用另一个成员,这实际上是省略了this;
- 当成员的名称存在冲突,会导致语法产生歧义时,就不能省略this关键字。
构造方法的调用
构造方法可以出现重载的情况。
public Cat() {}
public Cat(String name) {
this.name = name;
}
public Cat(String name,int age) {
this(name);
this.age = age;
}
如上我们看出可以通过this()调用重载的构造器。
说明:
- 构造方法的调用,只能在构造方法之间来完成
- 构造方法内可以使用this()来调用构造方法(有参、无参均可,只要是声明过的),且必须放在方法体内第一行。而且不允许出现两条this()语句。
- 构造方法在类内,普通方法不能调用构造方法
- 构造方法在类外进行调用时,只能配合new关键字
类中的普通方法之间也可以相互调用,如:
public void run(){
Cat(); //出错,普通方法不能调用构造方法
eat();//可以调用普通方法
System.out.println("aaa");
}