我们先来了解下 Python 中类的相关知识,在 Python 中所定义的类中即使没有显式的__init__初始化方法,实际上它也是默认带有__init__方法(一般情况下源于父类object,无任何参数),并在类实例化时进行调用。但是,如果我们需要所定义的类可以接收初始化参数,那么就必须使用__init__方法。
1. 默认构造器
Java 的构造器原理其实很类似,每个定义的类都有一个默认的隐式构造器,如果我们将这个隐式的构造器显式得定义出来,则如下所示:
public class Car {public Car() {}public static void main(String[] args) {}}
2. 带参构造器
有了上面的这种结构,我们很轻松的就可以完成带参的类构造器:
public class Car {String brand;String color;long price;public Car(String brand_, String color_, long price_) {brand = brand_;color = color_;price = price_;}public void run() {System.out.println(color + "-" + brand + " is running!");}public static void main(String[] args) {Car benz = new Car("Benz", "Red", 400000);benz.run();}}
回顾之前的示例,当时我们实例化一个Car类后,还需要 3 行代码来给成员变量进行赋值,如果有很多Car实例就会显得很麻烦。采用带参的构造器后,都不在需要手动赋值,这些操作在初始化的时候就完成了。
当然,与 Python 不同的是,Java 中是可以定义多个构造器的(这一点在前面介绍方法重载的时候就介绍过),如果构造了一个带参构造器的话,建议将默认的无参构造器也添加上。
public class Car {String brand;String color;long price;public Car() {}public Car(String brand_, String color_, long price_) {brand = brand_;color = color_;price = price_;}public void run() {System.out.println(color + "-" + brand + " is running!");}public static void main(String[] args) {Car benz = new Car("Benz", "Red", 400000);benz.run();}}
3. this关键字
有些同学可能已经发现了,我们在定义有参构造器时,参数的名称我们使用了brand_这样的方式,为什么?如果参数名称修改为brand的话,即下面所示的构造器,那么整个构造器是无法正常工作的(即使可以成功编译),因为 JVM 会默认这个brand是构造的参数,而非成员变量brand。
public Car(String brand, String color, long price) {brand = brand;color = color;price = price;}
3.1 this访问成员变量
为了避免这个问题,我们引入一个新的知识点this,使用this.brand来特指类的成员变量brand:
public class Car {String brand;String color;long price;public Car(String brand, String color, long ) {this.brand = brand;this.color = color;this.price = price;}public void run() {System.out.println(this.color + "-" + this.brand + " is running!");}public static void main(String[] args) {Car car = new Car("Benz", "Red", 400000);car.run();}}
实际上,每个方法都会默认传入this变量,并且this变量所指向的是当前调用它的实例。
3.2 this访问方法
同样地,可以使用this.run()方式来调用方法。当然,你直接使用run()也是可以的。
public Car(String brand, String color, long ) {this.brand = brand;this.color = color;this.price = price;this.run(); // run();}
3.3 this访问构造器
除此之外,this还可以访问构造器,前提条件是在无参构造器中访问其他有参构造器,这个时候this特指有参构造器,且下面高亮的代码必须放在第一行(原因很简单,只有当构造器创建好之后,才能继续执行其他内容,如果先执行其他内容再创建构造器,显然是不合理的)。
public class Car {String brand;String color;long price;public Car() {this("Benz", "Red", 400000);}public Car(String brand, String color, long price) {this.brand = brand;this.color = color;this.price = price;}public void run() {System.out.println(this.color + "-" + this.brand + " is running!");}public static void main(String[] args) {Car car = new Car("Benz", "Red", 400000);car.run();Car car2 = new Car();car2.run();}}
