本文仅供学习参考!
在任何面向对象的语言中,程序员都可以定义类并创建对象。在这些场景中,类成员需要一种初始化方法。构造函数是与类相关的特殊方法,它可以使用您想要的值初始化类的成员。
尽管构造函数在创建对象时由运行时隐式调用,但也可以显式调用。在本编程教程中,我们将研究构造函数、它们的优点以及开发人员如何在 Java 中使用构造函数。
Java 中的构造函数是什么?
构造函数是类的方法或成员函数,其名称与其所属类的名称相同,其唯一目的是初始化类成员。因此,您可以利用构造函数为类的成员设置初始值。
当您实例化类时,会隐式调用 Java 构造函数。虽然一个类中可以有多个构造函数,但可以有一个且只能有一个析构函数。Java 中的任何类都必须至少有一个构造函数。
需要注意的是,即使程序员没有在类中编写任何构造函数,类也隐式地提供了构造函数。默认情况下,运行时提供的这个构造函数称为默认构造函数。当使用不带任何参数的new运算符创建类时,将调用该类的默认构造函数。
以下代码示例说明了如何在 Java 中定义类:
class MyFirstJavaClass { MyFirstJavaClass() { // This is the constructor body }}
请注意,在前面的 Java 代码示例中,类的名称和类的构造函数的名称是相同的。
Java 中的构造函数重载是什么?
Java中的构造函数重载是一种为同一个类创建多个构造函数的方法。这允许开发人员在一个类中创建多个具有相同名称但签名不同的构造函数。
需要注意的是,重载的构造函数必须具有不同的签名。Java 中方法的签名包括方法名称、参数和返回类型。
由于构造函数没有任何返回类型,因此重载构造函数的参数类型和顺序必须不同。换句话说,构造函数的签名包括其参数的类型、数量和顺序。
当一个类具有多个构造函数时,编译器将使用重载解析规则来确定在创建该类的实例时将调用哪个构造函数。重载解析规则用于确保根据传入的参数调用适当的构造函数。
请注意,类的构造函数可以重载但不能重写,因为基类和派生类的构造函数永远不能具有相同的名称。
Java 中的构造函数永远不可能是“虚拟的”
构造函数既不能是虚拟的,也不能返回任何值。要将方法声明为虚拟方法,您需要在其签名中包含关键字virtual。
子类的方法可以重写虚方法。但是,您永远不能在派生类中重写基类的构造函数。您不能拥有虚拟构造函数(即类的构造函数永远不能是虚拟的),但可以拥有虚拟析构函数。
这样做的原因是,当构造函数正在执行时,虚拟表或vtable在内存中将不可用。类的虚表仅在类的构造函数执行完毕后才可用。
Java 中的无参构造函数和参数化构造函数
构造函数既可以是无参的,也可以是参数化的。顾名思义,无参构造函数是不接受任何参数的构造函数。默认构造函数是类中唯一的无参构造函数。换句话说,类中可以有一个(而且只能有一个)无参数构造函数。
参数化构造函数是一种可以接受一个或多个参数的构造函数。虽然 Java 中的类中可以有一个且只能有一个无参数构造函数,但您可以有多个参数化构造函数。
现在,请参考下面给出的代码示例。它展示了如何在 Java 中为类实现无参构造函数:
public class MyClass {private int x;public MyClass() {x = 0;System.out.println("No-argument constructor called...");}public static void main(String[] args) {MyClass obj = new MyClass();}}
下面的代码示例说明了如何在 Java 中为类定义参数构造函数:
public class MyClass {private int x;private int y;public MyClass(int i, int j) {x = i;y = j;}public int getValueOfX(){ return x;}public int getValueOfY(){ return y;}public static void main(String[] args) {MyClass obj = new MyClass(5, 10);System.out.printf("Printing the value of x : %d\n", obj.getValueOfX());System.out.printf("Printing the value of y : %d", obj.getValueOfY());}}
Java 中的复制构造函数
在 Java 中,复制构造函数可以定义为通过复制该类的当前实例来创建该类的新实例的构造函数。当您需要创建类的新实例,然后能够更改对象的状态而不影响原始对象时,请使用复制构造函数。因此,原始对象的状态在被复制后保持不变。
以下是在 Java 中使用复制构造函数的语法:
MyClass(MyClass obj) {//这是复制构造函数的主体。 }
要为类创建复制构造函数,程序员应该为类定义一个参数构造函数,其中参数的类型与类类型相同。以下代码示例展示了如何在 Java 中定义复制构造函数:
public class Product { private int id; private String name; public Product(Product product) { this.id = product.id; this.name = product.name; }
开发人员可以在 Java 中使用两种类型的复制构造函数:一种使用浅复制,另一种使用深复制。
Java继承中构造函数的执行顺序
属于类的构造函数按照类被继承的顺序被调用。相反,对析构函数的调用遵循相反的顺序。
下面的代码示例展示了如何在 Java 继承中调用构造函数:
public class HelloWorld { public static void main(String []args) { C obj = new C(); }}class A { public A() { System.out.println("Constructor of class A called..."); }}class B extends A { public B() { System.out.println("\nConstructor of class B called..."); }}class C extends B { public C() { System.out.println("Constructor of class C called..."); }}
当您执行上面的代码时,控制台窗口中的输出如下所示:
图 1:演示构造函数是按继承顺序执行的。
END
尽管开发人员可以在其他自定义方法中初始化类的成员,但最好定义构造函数来初始化它们。程序员还应该显式定义默认构造函数并编写自己的代码来初始化类成员——这也提高了可读性。需要注意的是,在Java中,构造函数不能是abstract、final、static或native。
来源地址:https://blog.csdn.net/m0_47015897/article/details/131412360