📜  java构造函数

📅  最后修改于: 2020-09-24 01:00:03             🧑  作者: Mango

Java构造函数

在Java中,构造函数是类似于该方法的代码块。创建类的实例时调用它。在调用构造函数时,将在内存中分配对象的内存。

这是一种特殊的方法,用于初始化对象。

每次使用new()关键字创建对象时,都会至少调用一个构造函数。

如果类中没有可用的构造函数,它将调用默认构造函数。在这种情况下,Java编译器默认提供默认的构造函数。

Java中有两种类型的构造函数:no-arg构造函数和参数化构造函数。

注意:之所以称为构造函数,是因为它在创建对象时构造值。不必为类编写构造函数。这是因为如果您的类没有任何类,则Java编译器会创建一个默认构造函数。

创建Java构造函数的规则

为构造函数定义了两个规则。

  • 构造函数名称必须与其类名称相同
  • 构造函数必须没有显式的返回类型
  • Java构造函数不能是抽象的,静态的,最终的和同步的

注意:我们可以在声明构造函数时使用访问修饰符。它控制对象的创建。换句话说,我们可以在Java中使用私有,受保护,公共或默认构造函数。

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值。

Java参数化构造函数

具有特定数量参数的构造函数称为参数化构造函数。

为什么要使用参数化构造函数?

参数化的构造函数用于为不同的对象提供不同的值。但是,您也可以提供相同的值。

参数化构造函数的示例

在此示例中,我们创建了具有两个参数的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中的构造函数重载是一种具有多个具有不同参数列表的构造函数的技术。它们的排列方式使每个构造函数执行不同的任务。编译器通过列表中的参数数量及其类型来区分它们。

构造函数重载示例

//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中的构造函数和方法之间的区别

构造函数和方法之间有许多差异。它们在下面给出。

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复制构造函数

Java中没有副本构造函数。但是,我们可以将值从一个对象复制到另一个对象,例如C++中的复制构造函数。

在Java中,有很多方法可以将一个对象的值复制到另一个对象中。他们是:

  • 按构造函数
  • 通过将一个对象的值分配给另一个对象
  • 通过Object类的clone()方法

在此示例中,我们将使用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中有构造函数类吗?

是。

构造器类的目的是什么?

Java提供了一个Constructor类,该类可用于获取该类中构造函数的内部信息。在java.lang.reflect包中可以找到它。