Java教程-详解Java 构造函数

在Java中,构造函数是类的特殊方法,它类似于一个代码块。它在创建类的实例时被调用,并负责初始化对象。当使用new
关键字创建对象时,至少会调用一个构造函数。
如果在类中没有定义构造函数,Java编译器将默认提供一个无参数的默认构造函数。这个默认构造函数没有任何参数,并且不执行任何特定的初始化操作。
Java中的构造函数遵循以下规则:
- 构造函数的名称必须与类名完全相同。
- 构造函数没有明确的返回类型,甚至没有
void
。 - 构造函数不能是抽象的、静态的、最终的或同步的。
需要注意的是,构造函数的访问修饰符可以是private
、protected
、public
或默认(没有修饰符)。这些修饰符控制了对象的创建权限,即谁可以调用构造函数。
Java中有两种类型的构造函数:
- 默认构造函数(无参数构造函数):当类中没有显式定义构造函数时,默认构造函数会被提供。它没有任何参数,并且执行默认的初始化操作。例如,创建一个对象时,如果没有指定特定的构造函数,则会调用默认构造函数。
- 参数化构造函数:参数化构造函数带有一个或多个参数,用于在创建对象时接收初始值。它允许在创建对象时直接为成员变量赋值。
默认构造函数的语法:
<类名>(){}
默认构造函数示例
在此示例中,我们在 Bike 类中创建无参数构造函数。它将在对象创建时被调用。
//Java 程序创建并调用默认构造函数
class Bike1{
//创建默认构造函数
Bike1(){System.out.println("自行车已创建");}
//主要方法
public static void main(String args[]){
//调用默认构造函数
Bike1 b=new Bike1();
}
}
输出:
自行车已创建
规则:如果类中没有构造函数,编译器会自动创建一个默认构造函数。
Q) 默认构造函数的目的是什么?
默认构造函数用于为对象提供默认值,如 0、null 等,具体取决于类型。
显示默认值的默认构造函数示例
//让我们看另一个默认构造函数的例子
//显示默认值
class Student3{
int id;
String name;
//显示id和name值的方法
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
//创建对象
Student3 s1=new Student3();
Student3 s2=new Student3();
//显示对象的值
s1.display();
s2.display();
}
}
输出:
0 null
0 null
说明:在上述示例的类中,没有定义任何构造函数,因此编译器为您提供了一个默认构造函数。该默认构造函数会将成员变量的值初始化为0(对于数值类型)或null(对于引用类型)。
Java参数化构造函数
具有特定参数数量的构造函数称为参数化构造函数。
使用参数化构造函数的目的
参数化构造函数用于为不同的对象提供不同的初始值。但是,您也可以为多个对象提供相同的初始值。
参数化构造函数示例
在下面的示例中,我们创建了一个名为Student
的类,并定义了一个具有两个参数的构造函数。在构造函数中,我们可以使用任意数量的参数来满足需求。
//Java程序演示参数化构造函数的使用。
class Student4{
int id;
String name;
//创建参数化构造函数
Student4(int i,String n){
id = i;
name = n;
}
//显示值的方法
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
//创建对象并传递值
Student4 s1 = new Student4(111,"小卡");
Student4 s2 = new Student4(222,"小安");
//调用方法显示对象的值
s1.display();
s2.display();
}
}
输出:
111 小卡
222 小安
Java 中的构造函数重载
在 Java 中,构造函数与方法类似,但没有返回类型。与方法一样,构造函数也可以进行重载(overload)。
构造函数重载是指在同一个类中定义多个构造函数,它们具有不同的参数列表。每个构造函数执行不同的任务,通过参数列表的数量和类型的不同来区分它们。
编译器通过参数的数量和类型来区分构造函数重载。当创建对象时,根据提供的参数来调用相应的构造函数。这样可以根据不同的需求创建具有不同初始化方式的对象。
构造函数重载的例子
//Java程序重载构造函数
class Student5{
int id;
String name;
int age;
//创建两个arg构造函
Student5(int i,String n){
id = i;
name = n;
}
//创建三参数构造函数
Student5(int i,String n,int a){
id = i;
name = n;
age=a;
}
void display(){System.out.println(id+" "+name+" "+age);}
public static void main(String args[]){
Student5 s1 = new Student5(111,"小卡");
Student5 s2 = new Student5(222,"小安",25);
s1.display();
s2.display();
}
}
输出:
111 小卡 null
222 小安 25
Java中构造函数和方法的区别
构造函数和方法之间存在许多差异。它们在下面给出。
Java构造函数 | 方法 |
---|---|
构造函数用于初始化对象的状态。 | 方法用于暴露对象的行为。 |
构造函数不能有返回类型。 | 方法必须有返回类型。 |
构造函数被隐式调用。 | 该方法被显式调用。 |
如果类中没有任何构造函数,Java 编译器会提供默认构造函数。 | 在任何情况下,编译器都不会提供该方法。 |
构造函数名必须与类名相同。 | 方法名可能与类名相同,也可能不同。 |
Java 复制构造函数
在 Java 中,没有直接对应于 C++ 中复制构造函数的概念。然而,我们可以使用不同的方法将一个对象的值复制到另一个对象中,实现类似的功能。
以下是几种在 Java 中实现对象值复制的常见方法:
- 通过构造函数:可以定义一个构造函数,接受一个对象作为参数,并将该对象的值复制到新对象中。这种方法允许您自定义复制的方式。
- 通过赋值操作符:可以使用赋值操作符将一个对象的值分配给另一个对象。这种方法只是将对象引用进行复制,而不是创建一个新的对象。
- 通过
clone()
方法:Object
类提供了clone()
方法,可以实现对象的浅拷贝。通过调用clone()
方法可以创建一个与原始对象相同的新对象,新对象与原始对象共享相同的引用。
在此示例中,我们将使用 Java 构造函数将一个对象的值复制到另一个对象中。
//Java 程序将值从一个对象初始化为另一个对象。
class Student6{
int id;
String name;
//初始化整数和字符串的构造函数
Student6(int i,String n){
id = i;
name = n;
}
//构造函数来初始化另一个对象
Student6(Student6 s){
id = s.id;
name =s.name;
}
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student6 s1 = new Student6(111,"小卡");
Student6 s2 = new Student6(s1);
s1.display();
s2.display();
}
}
输出:
111小卡
111小卡
在没有构造函数的情况下复制值
我们可以通过将一个对象的值分配给另一个对象来将一个对象的值复制到另一个对象中。在这种情况下,无需创建构造函数。
class Student7{
int id;
String name;
Student7(int i,String n){
id = i;
name = n;
}
Student7(){}
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student7 s1 = new Student7(111,"小卡");
Student7 s2 = new Student7();
s2.id=s1.id;
s2.name=s1.name;
s1.display();
s2.display();
}
}
输出:
111小卡
111小卡
问)构造函数是否返回任何值?
是的,它是当前的类实例(你不能使用返回类型但它返回一个值)。
构造函数可以执行其他任务而不是初始化吗?
是的,像创建对象、启动线程、调用方法等。您可以像在方法中执行操作一样在构造函数中执行任何操作。
Java中有构造函数类吗?
有的。
Constructor类的目的是什么?
Java提供了一个Constructor类,可以用来获取类中构造函数的内部信息。它位于 java.lang.reflect 包中。