Java 简明教程
Java - Constructors
Java Constructors
通常,您会使用构造函数为类定义的实例 variables 提供初始值,或执行创建完全形成的对象所需的任何其他启动过程。
所有类都有构造函数,无论您是否定义了一个,因为 Java 会自动提供一个将所有成员变量初始化为零的默认构造函数。然而,一旦您定义了自己的构造函数,默认构造函数将不再使用。
Rules for Creating Java Constructors
在创建 Java 构造函数时,您必须遵循以下规则:
-
构造函数的名称必须与类名相同。
-
Java 构造函数没有返回类型。也不要将 void 用作返回类型。
-
一个类中可以有多个构造函数,这个概念被称为构造函数重载。
-
access modifiers 可以与构造函数一起使用,可用于更改构造函数的可见性/可访问性。
-
Java 提供了在创建对象时调用的默认构造函数。如果创建了任何类型的构造函数,则不会调用默认构造函数(由 Java 提供)。
Creating a Java Constructor
要在 Java 中创建构造函数,只需编写构造函数的名称(与类名称相同),后跟括号,然后在花括号({})内编写构造函数的主体。
Example to create a Java Constructor
以下示例创建了一个简单的构造函数,它将打印“Hello world”。
public class Main {
// Creating a constructor
Main() {
System.out.println("Hello, World!");
}
public static void main(String[] args) {
System.out.println("The main() method.");
// Creating a class's object
// that will invoke the constructor
Main obj_x = new Main();
}
}
此程序将打印:
The main() method.
Hello, World!
Types of Java Constructors
Java 中有三种不同类型的构造函数,我们将其列在下面:
-
Default Constructor
-
No-Args Constructor
-
Parameterized Constructor
1. Default Constructor
如果您在类中没有创建任何构造函数,Java 将提供一个初始化对象的默认构造函数。
在此示例中,没有我们定义的构造函数。默认构造函数用于初始化对象。
public class Main {
int num1;
int num2;
public static void main(String[] args) {
// We didn't created any structure
// a default constructor will invoke here
Main obj_x = new Main();
// Printing the values
System.out.println("num1 : " + obj_x.num1);
System.out.println("num2 : " + obj_x.num2);
}
}
Output
num1 : 0
num2 : 0
2. No-Args (No Argument) Constructor
正如名称所说明的那样,无参数构造函数不接受任何参数。通过使用无参数构造函数,您可以在对象创建时初始化类数据成员和执行您希望执行的各种活动。
此示例创建无参数构造函数。
public class Main {
int num1;
int num2;
// Creating no-args constructor
Main() {
num1 = -1;
num2 = -1;
}
public static void main(String[] args) {
// no-args constructor will invoke
Main obj_x = new Main();
// Printing the values
System.out.println("num1 : " + obj_x.num1);
System.out.println("num2 : " + obj_x.num2);
}
}
Output
num1 : -1
num2 : -1
3. Parameterized Constructor
具有一个或多个参数的构造函数称为参数化构造函数。
大多数情况下,您需要接受一个或多个参数的构造函数。将参数添加到构造函数中的方式与将它们添加到方法中的方式相同,只需在构造函数名称后的括号内声明它们即可。
此示例创建了一个参数化构造函数。
public class Main {
int num1;
int num2;
// Creating parameterized constructor
Main(int a, int b) {
num1 = a;
num2 = b;
}
public static void main(String[] args) {
// Creating two objects by passing the values
// to initialize the attributes.
// parameterized constructor will invoke
Main obj_x = new Main(10, 20);
Main obj_y = new Main(100, 200);
// Printing the objects values
System.out.println("obj_x");
System.out.println("num1 : " + obj_x.num1);
System.out.println("num2 : " + obj_x.num2);
System.out.println("obj_y");
System.out.println("num1 : " + obj_y.num1);
System.out.println("num2 : " + obj_y.num2);
}
}
Output
obj_x
num1 : 10
num2 : 20
obj_y
num1 : 100
num2 : 200
这里有一个使用构造函数的简单示例 −
// A simple constructor.
class MyClass {
int x;
// Following is the constructor
MyClass(int i ) {
x = i;
}
}
您可以按如下方式调用构造函数来初始化对象 −
public class ConsDemo {
public static void main(String args[]) {
MyClass t1 = new MyClass( 10 );
MyClass t2 = new MyClass( 20 );
System.out.println(t1.x + " " + t2.x);
}
}
Output
10 20
Constructor Overloading in Java
构造函数重载表示类中有多个构造函数。当您有多个带有不同参数的构造函数时,它将称为构造函数重载。
Example: Constructor Overloading
在此示例中,我们有一个以上的构造函数。
// Example of Java Constructor Overloading
// Creating a Student Class
class Student {
String name;
int age;
// no-args constructor
Student() {
this.name = "Unknown";
this.age = 0;
}
// parameterized constructor having one parameter
Student(String name) {
this.name = name;
this.age = 0;
}
// parameterized constructor having both parameters
Student(String name, int age) {
this.name = name;
this.age = age;
}
public void printDetails() {
System.out.println("Name : " + this.name);
System.out.println("Age : " + this.age);
}
}
public class Main {
public static void main(String[] args) {
Student std1 = new Student(); // invokes no-args constructor
Student std2 = new Student("Jordan"); // invokes parameterized constructor
Student std3 = new Student("Paxton", 25); // invokes parameterized constructor
// Printing details
System.out.println("std1...");
std1.printDetails();
System.out.println("std2...");
std2.printDetails();
System.out.println("std3...");
std3.printDetails();
}
}
Output
td1...
Name : Unknown
Age : 0
std2...
Name : Jordan
Age : 0
std3...
Name : Paxton
Age : 25