Java 默认和参数化构造函数

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(280)   2023-06-26 07:54:18

Java 构造函数是特殊的类似方法的构造,允许在应用程序中的其他类可以使用它之前完全初始化对象状态。使用 new 关键字调用构造函数。

1.什么是Java中的构造函数?

构造函数是特殊的类似方法(但不完全是方法)的构造,可帮助程序员编写 对象初始化代码,在对象可供应用程序中的其他对象使用之前。

public class MyClass {

  public MyClass() {
    //...
  }
}

每当应用程序需要任何类的新实例时,JVM 都会在堆内分配一个内存区域。然后 JVM 执行调用的构造函数(类可以有多个构造函数)并初始化对象状态。在构造函数内部,我们可以访问所有对象属性并将它们分配给它们的默认值或所需值。

如果我们没有在类中定义任何构造函数,JVM 会自动插入一个空主体的默认构造函数。

2. 默认和参数化构造函数

构造函数可以有两种类型。不接受任何参数的构造函数也称为默认构造函数。其他接受参数的构造函数称为参数化构造函数。

Java constructor

2.1.默认构造函数

如果我们不在类中提供任何构造函数,JVM 会在编译期间为类提供默认构造函数。在默认构造函数中,构造函数的名称必须与类名匹配,并且不应该有任何参数。

public class Employee { 

  public Employee() {
     super();
  }
}

请注意,我们还可以覆盖默认构造函数并添加更多与状态初始化相关的代码。

public class Employee { 

  public Employee() {

     //addtional statements
     this.age = calculateAgeFromDateOfBirth();
  }
}

2.2.参数化构造函数

一个类中可以有多个构造函数。我们可以在类中定义重载构造函数,在每个构造函数中接受一组不同的参数。

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 '()'

3. 创建构造函数的规则

在 java 中创建构造函数有一些强制性规则。

  • 构造函数名称必须与类名相同。
  • 构造函数定义中不能有任何返回类型。
  • 构造函数中不能有return语句。
  • 构造函数可以被不同的参数重载。
  • 如果你想使用super()即父类构造函数,那么它必须是构造函数中的第一条语句。

4. 使用 this()super() 的构造函数链接

在 Java 中,可以在构造函数中调用其他构造函数。它就像方法调用一样,但没有任何引用变量(显然,因为实例现在还没有完全初始化)。

现在我们可以调用同一个类或父类的构造函数。两者都使用不同的语法。

4.1.用 this() 调用同一个类的构造函数

要从同一类调用其他构造函数,请使用 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
}

4.2.使用 super() 调用父类的构造函数

要从超类或父类调用构造函数,请使用 super 关键字。 super 关键字的用法类似于 this 关键字——唯一的区别是 super 指的是超类,而 $$$ 指的是当前实例。

public class Parent {

  public Parent() {
    //...
  }
}

public class Child extends Parent {

  public Child() {
    super(); //invokes Parent's constructor
  }
}

5.私有构造函数

有时我们想保护构造函数不被其他类调用。总之,我们希望没有人能够创建该类的新实例。

为什么会有人想要那个?好吧,这对于单例模式来说是必要的。在单例中,应用程序希望拥有任何类的一个且只有一个实例。

一个常见的单例类定义如下所示:

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

相关阅读

面向对象编程 (OOP) 是指一种基于对象的编程方法,而不仅仅是函数式编程中的函数和过程。这些对象可以包含数据(属性)和方法(行为),就像我们在应用程序中建模的真实实体一样。 本教程将教给我们四...
1. OOP核心概念问题 1.1. OOP 的四大支柱是什么? OOP 所依赖的主要支柱是封装、继承、多态 和抽象。 封装为我们的应用程序提供安全性;它由私有变量声明(数据隐藏)和访问变量的访问...
Java 构造函数是特殊的类似方法的构造,允许在应用程序中的其他类可以使用它之前完全初始化对象状态。使用 new 关键字调用构造函数。 1.什么是Java中的构造函数? 构造函数是特殊的类似方法...
在 Java 中,抽象 仅捕获与当前上下文相关的类的那些细节。 例如,java.util.Map 存储键值对并公开两个方法 get() 和 put()存储和检索键值对。事实上,如果我们想在应用程...
Scala 3, the latest version of the object-oriented, 具有 JVM 和 JavaScript 运行时的函数式语言, is now availab...
在这个 Java 正则表达式单词边界示例 中,我们将学习如何匹配字符串中的特定单词。例如我们将在“java is object oriented language”中匹配“java”。但它不应该...
Java 实例初始化程序 是包含每次创建新类实例时运行的指令的代码块。我们可以使用初始化块来编写对所有构造函数通用的初始化登录,否则必须在每个构造函数中单独编写。 1.语法 实例初始化块是用花括...
Java 实例 operator (also called 类型比较运算符) is used to test whether the specified object is an instanc...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
在本文中,我们介绍了 Java 中的面向对象编程。我们提到了 Java 对象、对象属性和方法、对象构造函数和访问修饰符。此外,我们还讨论了 super 关键字、构造函数链接、类常量、继承、多态性...