章
目
录
Java 构造函数是特殊的类似方法的结构,允许在应用程序中的其他类可以使用对象之前完全初始化对象状态。构造函数是使用 new 关键字调用的。
1. Java中的构造函数是什么?
构造函数是特殊的类似方法(但不完全是方法)的构造,可帮助程序员在对象可供应用程序中的其他对象使用之前编写对象初始化代码。
public class MyClass {
public MyClass() {
//...
}
}
每当应用程序需要一个类的新实例时,JVM 会在堆内存中分配一个内存区域。然后 JVM 执行被调用的构造函数(一个类可以有多个构造函数),并初始化对象状态。在构造函数内部,我们可以访问所有对象属性并将它们分配给它们的默认或所需值。
如果我们没有在类中定义任何构造函数,JVM 会自动插入一个带有空主体的默认构造函数。
2.默认和参数化构造函数
构造函数可以有两种类型。不接受任何参数的构造函数也称为默认无参构造函数。其他接受参数的构造函数称为有参构造函数。
//编译器提供的默认构造函数
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(); //报错
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指的是超类,而this
指的是当前实例。
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中构造函数的全部内容。在评论部分告诉我你的问题。
文章目录前言 第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符串 […]