Java 构造函数是特殊的类似方法的构造,允许在应用程序中的其他类可以使用它之前完全初始化对象状态。使用 new
关键字调用构造函数。
构造函数是特殊的类似方法(但不完全是方法)的构造,可帮助程序员编写 对象初始化代码,在对象可供应用程序中的其他对象使用之前。
public class MyClass {
public MyClass() {
//...
}
}
每当应用程序需要任何类的新实例时,JVM 都会在堆内分配一个内存区域。然后 JVM 执行调用的构造函数(类可以有多个构造函数)并初始化对象状态。在构造函数内部,我们可以访问所有对象属性并将它们分配给它们的默认值或所需值。
如果我们没有在类中定义任何构造函数,JVM 会自动插入一个空主体的默认构造函数。
构造函数可以有两种类型。不接受任何参数的构造函数也称为默认构造函数。其他接受参数的构造函数称为参数化构造函数。
如果我们不在类中提供任何构造函数,JVM 会在编译期间为类提供默认构造函数。在默认构造函数中,构造函数的名称必须与类名匹配,并且不应该有任何参数。
public class Employee {
public Employee() {
super();
}
}
请注意,我们还可以覆盖默认构造函数并添加更多与状态初始化相关的代码。
public class Employee {
public Employee() {
//addtional statements
this.age = calculateAgeFromDateOfBirth();
}
}
一个类中可以有多个构造函数。我们可以在类中定义重载构造函数,在每个构造函数中接受一组不同的参数。
public class Employee {
private String firstName;
private String lastName;
public Employee() { //constructor 1
}
public Employee(String firstName) { //constructor 2
//statements
}
public Employee(String firstName, String lastName) { //constructor 3
//statements
}
}
如果我们在类中定义一个非默认的参数化构造函数,那么 JVM 将不会在字节码中插入默认构造函数。在这种情况下,如果需要默认构造函数,我们必须显式创建默认构造函数。
例如,在下面的 Employee 类中,我们只创建了一个参数化构造函数:
class Employee {
public Employee(String name) {
}
}
如果我们尝试使用默认构造函数创建 Employee 的实例,则会发生编译错误:
Employee employee = new Employee(); //'Employee(java.lang.String)' in 'Employee' cannot be applied to '()'
在 java 中创建构造函数有一些强制性规则。
super()
即父类构造函数,那么它必须是构造函数中的第一条语句。在 Java 中,可以在构造函数中调用其他构造函数。它就像方法调用一样,但没有任何引用变量(显然,因为实例现在还没有完全初始化)。
现在我们可以调用同一个类或父类的构造函数。两者都使用不同的语法。
要从同一类调用其他构造函数,请使用 this 关键字。在下面的代码中,this() 调用默认构造函数,this(firstName) 调用第一个构造函数,它接受一个类型为 String 的参数.
public Employee() {
}
public Employee(String firstName) {
this(); //calling default constructor
}
public Employee(String firstName, String lastName) {
this(firstName); //calling constructor with single argument of String type
}
要从超类或父类调用构造函数,请使用 super 关键字。 super 关键字的用法类似于 this
关键字——唯一的区别是 super 指的是超类,而 $$$
指的是当前实例。
public class Parent {
public Parent() {
//...
}
}
public class Child extends Parent {
public Child() {
super(); //invokes Parent's constructor
}
}
有时我们想保护构造函数不被其他类调用。总之,我们希望没有人能够创建该类的新实例。
为什么会有人想要那个?好吧,这对于单例模式来说是必要的。在单例中,应用程序希望拥有任何类的一个且只有一个实例。
一个常见的单例类定义如下所示:
public class DemoSingleton implements Serializable
{
private static final long serialVersionUID = 1L;
private DemoSingleton() {
// private constructor
}
private static class DemoSingletonHolder {
public static final DemoSingleton INSTANCE = new DemoSingleton();
}
public static DemoSingleton getInstance() {
return DemoSingletonHolder.INSTANCE;
}
protected Object readResolve() {
return getInstance();
}
}
这就是关于 java 中的构造函数的全部内容。在评论部分将您的问题告诉我。
快乐学习!!
地址:https://www.cundage.com/article/java-constructors.html