Java构造器方法深入理解
在Java类中,构造器方法负责创建并初始化该类的对象。构造器方法具体来说就是一个特殊的方法,它与类名称相同,并用于创建该类的对象。在本篇文章中,我们将深入探讨Java中的构造器,包括构造器的重载、默认构造器、构造器链、this和super关键字等概念。
构造器重载
在一个类中,你可以定义多个构造器。这就叫做构造器的重载。构造器的重载可以让你创建多样化的对象,以满足对不同的构造方法进行特定场景的需求。
以下是一个构造器方法重载的示例代码:
public class Car {
private int weight;
private int speed;
private String brand;
public Car() {
this.weight = 1000;
this.speed = 100;
this.brand = "Unknown";
}
public Car(int weight, int speed, String brand) {
this.weight = weight;
this.speed = speed;
this.brand = brand;
}
//getters and setters omitted for brevity
}
上述代码中我们创建了一个Car
类。这个类有两个构造器:一个无参数构造器,一个有参数构造器。当你使用默认构造器创建一个新的Car
对象时,它的属性值为默认值(分别为:1000、100和“Unknown”)。如果你使用有参数的构造器,则可以根据提供的参数值初始化weight
、speed
和brand
属性。
默认构造器
如果你没有显式地为一个类定义构造方法,Java将会为你创建一个默认的构造器。那么什么是默认构造器呢?默认构造器是指没有参数的构造器,只用一个空括号来表示(例如:public MyClass() {}
)。当你用MyClass
类创建新的对象时,系统会自动调用该类的默认构造器。
以下是一个没有显式定义构造器的示例代码:
public class Person {
private String name;
private int age;
//add getters and setters omitted for clarity
public void introduce() {
System.out.println("Hello, My name is " + this.name + " and " + this.age + " years old.");
}
}
上述代码中的Person
类中没有构造器(如Person() {}
)。因此,如果你没有显式为该类创建构造器,Java将会默认创建一个没有参数的构造器。如果你想要访问Person
的属性,你可以使用getter和setter方法。当你创建一个Person
对象时,系统将会调用默认构造器(如果需要的话),并返回初始值为null
和0
的Person对象。
使用默认构造器,你可以使用getter和setter方法或者其他的方法来设置和获取Person的属性。
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.setName("Lucy");
p.setAge(16);
p.introduce(); //Hello, My name is Lucy and 16 years old.
}
}
构造器链
在Java类中,你可以通过this关键字来调用其他的构造器方法,这就叫做构造器链。构造器链的好处是可以消除代码冗余,避免重复进行对象初始化。
以下是一个使用构造器链的示例代码:
public class Person {
private String name;
private int age;
private String address;
//default constructor
public Person() {
this("unknown");
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this(name, age, "unknown");
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//add getters and setters omitted for clarity
}
上述代码中的Person
类中定义了四个构造器,它们之间形成了构造器链。这就意味着,如果你创建一个新的Person
对象时,Java将首先调用最后一个参数为name
、age
和address
的构造器。如果未指定任何参数,Java将调用默认构造器,并且因为Person()
构造器调用Person("unknown")
构造器,因此你创建的Person
对象将会有一个名为"unknown"的默认地址。
以下是一个构造器链的示例:
Person p1 = new Person(); // name="unknown" age=0 address="unknown"
Person p2 = new Person("Lucy"); // name="Lucy" age=0 address="unknown"
Person p3 = new Person("Bob", 25); // name="Bob" age=25 address="unknown"
Person p4 = new Person("Tom", 23, "China"); // name="Tom" age=23 address="China"
this和super关键字
在Java类中,你可以使用this
关键字引用当前对象或调用另一个构造器方法。你还可以使用super
关键字调用父类的构造器方法或其公用方法。
我们来看一个示例,使用super
和this
关键字来调用构造器方法:
class Vehicle {
private int weight;
public Vehicle() {
this(0);
}
public Vehicle(int weight) {
this.weight = weight;
System.out.println("Vehicle with weight " + weight + " has been created.");
}
public void startEngine() {
System.out.println("Engine has started!");
}
}
public class Car extends Vehicle {
private String brand;
public Car() {
super(1000);
}
public Car(int weight, String brand) {
super(weight);
this.brand = brand;
System.out.println("New " + brand + " car with weight " + weight + " has been created.");
}
}
上面的代码中,我们定义了一个Vehicle
类和一个Car
类。Vehicle
是一个父类,Car
是一个子类,继承自Vehicle
类。在Vehicle
中,我们定义了一个构造器方法,它与默认构造器方法不同在于参数列表中含有一个int weight
参数,Vehicle
构造器也调用了syuper()
。
在Car
类中,我们定义了两个构造器方法。其中,第一个构造器一旦被调用,将会默认调用其父类构造器,即super()
。第二个构造器也调用了其父类构造器,并在父类构造器调用结束后用this()
完成了剩下的初始化操作。通过这种方式,我们可以使用super
和this
关键字重载父类的构造器和子类的构造器。
以下是一个使用this
和super
的示例:
public class Test {
public static void main(String[] args) {
Car car1 = new Car(); //Vehicle with weight 1000 has been created.
//New null car with weight 1000 has been created.
Car car2 = new Car(1200, "Benz"); //Vehicle with weight 1200 has been created.
//New Benz car with weight 1200 has been created.
}
}
通过这篇文章,我们深入了解了Java构造器方法的基础并且掌握了使用构造器链、this和super关键字等高级用法的技巧。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java构造器方法深入理解 - Python技术站