📅  最后修改于: 2020-09-24 01:00:03             🧑  作者: Mango
在Java中,构造函数是类似于该方法的代码块。创建类的实例时调用它。在调用构造函数时,将在内存中分配对象的内存。
这是一种特殊的方法,用于初始化对象。
每次使用new()关键字创建对象时,都会至少调用一个构造函数。
如果类中没有可用的构造函数,它将调用默认构造函数。在这种情况下,Java编译器默认提供默认的构造函数。
Java中有两种类型的构造函数:no-arg构造函数和参数化构造函数。
注意:之所以称为构造函数,是因为它在创建对象时构造值。不必为类编写构造函数。这是因为如果您的类没有任何类,则Java编译器会创建一个默认构造函数。
为构造函数定义了两个规则。
注意:我们可以在声明构造函数时使用访问修饰符。它控制对象的创建。换句话说,我们可以在Java中使用私有,受保护,公共或默认构造函数。
Java有两种类型的构造函数:
没有任何参数的构造函数称为“默认构造函数”。
(){}
在此示例中,我们在Bike类中创建no-arg构造函数。将在创建对象时调用它。
//Java Program to create and call a default constructor
class Bike1{
//creating a default constructor
Bike1(){System.out.println("Bike is created");}
//main method
public static void main(String args[]){
//calling a default constructor
Bike1 b=new Bike1();
}
}
输出:
规则:如果类中没有构造函数,则编译器会自动创建一个默认构造函数。
默认构造函数用于根据类型为对象提供默认值,例如0,null等。
//Let us see another example of default constructor
//which displays the default values
class Student3{
int id;
String name;
//method to display the value of id and name
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
//creating objects
Student3 s1=new Student3();
Student3 s2=new Student3();
//displaying values of the object
s1.display();
s2.display();
}
}
输出:
0 null
0 null
说明:在上面的类中,您没有创建任何构造函数,因此编译器为您提供了默认的构造函数。在这里,默认构造函数提供0和null值。
具有特定数量参数的构造函数称为参数化构造函数。
参数化的构造函数用于为不同的对象提供不同的值。但是,您也可以提供相同的值。
在此示例中,我们创建了具有两个参数的Student类的构造函数。构造函数中可以有任意数量的参数。
//Java Program to demonstrate the use of the parameterized constructor.
class Student4{
int id;
String name;
//creating a parameterized constructor
Student4(int i,String n){
id = i;
name = n;
}
//method to display the values
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
//creating objects and passing values
Student4 s1 = new Student4(111,"Karan");
Student4 s2 = new Student4(222,"Aryan");
//calling method to display the values of object
s1.display();
s2.display();
}
}
输出:
在Java中,构造函数就像方法一样,但是没有返回类型。它也可以像Java方法一样重载。
Java中的构造函数重载是一种具有多个具有不同参数列表的构造函数的技术。它们的排列方式使每个构造函数执行不同的任务。编译器通过列表中的参数数量及其类型来区分它们。
//Java program to overload constructors
class Student5{
int id;
String name;
int age;
//creating two arg constructor
Student5(int i,String n){
id = i;
name = n;
}
//creating three arg constructor
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,"Karan");
Student5 s2 = new Student5(222,"Aryan",25);
s1.display();
s2.display();
}
}
输出:
构造函数和方法之间有许多差异。它们在下面给出。
Java Constructor | Java Method |
---|---|
A constructor is used to initialize the state of an object. | A method is used to expose the behavior of an object. |
A constructor must not have a return type. | A method must have a return type. |
The constructor is invoked implicitly. | The method is invoked explicitly. |
The Java compiler provides a default constructor if you don’t have any constructor in a class. | The method is not provided by the compiler in any case. |
The constructor name must be same as the class name. | The method name may or may not be same as the class name. |
Java中没有副本构造函数。但是,我们可以将值从一个对象复制到另一个对象,例如C++中的复制构造函数。
在Java中,有很多方法可以将一个对象的值复制到另一个对象中。他们是:
在此示例中,我们将使用Java构造函数将一个对象的值复制到另一个对象。
//Java program to initialize the values from one object to another object.
class Student6{
int id;
String name;
//constructor to initialize integer and string
Student6(int i,String n){
id = i;
name = n;
}
//constructor to initialize another object
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,"Karan");
Student6 s2 = new Student6(s1);
s1.display();
s2.display();
}
}
输出:
通过将对象的值分配给另一个对象,我们可以将一个对象的值复制到另一个对象中。在这种情况下,无需创建构造函数。
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,"Karan");
Student7 s2 = new Student7();
s2.id=s1.id;
s2.name=s1.name;
s1.display();
s2.display();
}
}
输出:
是的,它是当前的类实例(您不能使用返回类型,但它会返回一个值)。
是的,例如对象创建,启动线程,调用方法等。您可以像在方法中执行操作一样在构造函数中执行任何操作。
是。
Java提供了一个Constructor类,该类可用于获取该类中构造函数的内部信息。在java.lang.reflect包中可以找到它。