Java构造器的完整指南

65 阅读6分钟

我们可以说构造函数是一种特殊类型的方法,通过它我们可以初始化类的对象。 它在创建一个对象的时候构建值。 这就是为什么它被称为构造函数。

为一个类创建构造器并不是强制性的,因为如果该类中没有构造器,编译时的构造器是默认创建的。

Java 构造函数

Java 中的构造函数 是一种特殊的方法,用于初始化新创建的对象,在为该对象分配内存后被调用。在创建对象时,它可以用来将对象初始化为所需的或默认的值。

Java构造 器是类似Java方法的 代码 块。当一个对象实例被创建并且内存被分配给该对象时,它被调用。

每次使用new()关键字创建对象时,至少有一个构造函数被调用。首先,它调用一个默认的构造函数。它被称为构造函数,因为它在对象创建时构造了值。

没有必要为类写一个构造函数。这是因为如果你的类没有任何构造函数,Java编译器会创建一个默认的构造函数。

Java Constructor Tutorial

构造函数与类的名称相同,在java代码中看起来像这样:

public class Acme {

   //This is the constructor
   Acme(){

   }
   ..
}

有一点需要注意的是,构造函数的名称与类的名称一致,并且没有返回类型。

Java中的简单构造器程序

请看下面的代码:

// Scan.java

public class Scan {
  String hero;

  // Constructor
  Scan() {
    this.hero = "Ironman";
  }

  public static void main(String[] args) {
    Scan obj = new Scan();
    System.out.println(obj.hero);
  }
}

当你运行上述代码时,它将返回输出为"铁人"。

创建任何构造函数的一些重要规则

  1. 构造函数的名称必须与类的名称相同。
  2. 它不能有任何明确的返回值。
  3. java的构造函数不能是抽象的、最终的和同步的。
  4. 每个类都有一个构造函数,无论是普通类还是抽象类。
  5. 如果你没有在类中实现任何构造函数,编译器会帮你实现。
  6. 构造函数重载是可能的,但重载是不可能的。这意味着我们可以在我们的类中有一个重载的构造函数,但我们不能覆盖一个构造函数。
  7. 如果Superclass没有一个no-arg(default)构造函数,那么编译器就不会像在标准情况下那样在子类中插入一个默认构造函数。
  8. 接口没有构造函数。
  9. 一个构造函数也可以使用this()调用同一类的另一个构造函数。例如,如果你想调用参数化的构造函数,那么像下面这样做:this(参数列表)
  10. 构造函数不能被继承。

注意: 我们可以在创建任何构造函数时使用一个访问修饰符来控制对象的创建。我们可以使用Java的public、private、default或protected访问修饰符。

构造函数的类型

有两种类型的构造函数。我们将逐一讨论:

  1. 默认构造函数(无参数)
  2. 参数化构造函数

缺省构造函数

默认构造函数初始化对象的默认值。而且这个构造函数不接受任何参数。它调用了对象的创建。

语法

<Class name> () {}

请看下面的代码示例:

// Box.java

class Box
{
	//default constructor 
	Box()
	{
		System.out.println("Constructor for Box class have been created");
	}
	public static void main(String [] ar)
	{
		//invoking constructor while initializing object 
		Box b= new Box();
	}
}

请看输出:

Default Constructor in Java

为什么我们要使用默认构造函数?

我们使用默认构造函数来为对象提供默认值(0、null等)。

让我们看一个例子来正确理解这一点:

// DefaultCons.java

//default constructor which displays the default values  
class DefaultCons
{  
  int length;  
  String name;

  //method to display the value of id and name  
  void display()
  {
	System.out.println(length+" "+name);
  }  
  
  public static void main(String args[])
  {  
	//creating objects  
	DefaultCons d1=new DefaultCons();  
	DefaultCons d2=new DefaultCons();  
        
        //displaying values of the object  
	 d1.display();  
	 d2.display();  
    }  
}

请看输出:

Why we use default constructor?

在上面的类中,我们没有创建任何构造函数,所以编译器为你提供了一个默认构造函数。这里的0和null值是由默认构造函数提供的。

参数化构造函数

一个包含参数的构造函数被称为参数化构造函数。它被用来为不同的对象提供不同的值。

让我们看一个例子。首先,我们将创建一个类,然后是一个参数化构造函数。最后,我们将初始化对象的值:

// Student.java

//Java Program to demonstrate the use of parameterized constructor  
class Student
{  
    int id;  
    String name;  
    
   //creating a parameterized constructor  
    Student(int id,String name)
    {  
      this.id = id;  
      this.name = name;  
    }  
    //method to display the values  
    void show()
    {
	System.out.println(id+" "+name);
    }  
   
    public static void main(String args[])
    {  
        //creating objects and passing values  
        Student s1 = new Student(100,"Ram");
        Student s2 = new Student(200,"Rahim");  
        //calling method to display the values of object  
        s1.show();  
        s2.show();  
    }  
}

请看输出:

Parametrized Constructor in Java

构造函数重载

Java构造函数就像方法,但没有返回类型。

因此,它可以像传统方法一样被重载。

在Java中,构造函数的重载涉及到拥有一个以上的构造函数,并有不同的参数列表。它们的排列方式是,每个构造函数执行另一项任务。编译器通过列表中参数的数量和它们的类型来区分它们。

请看下面的代码:

// Student2.java

//Java program to overload constructors in java  
class Student2
{  
    int id;  
    String name;  
    int age;  
    //creating two arg constructor  
    Student2(int id,String name)
    {  
       this.id = id;  
       this.name = name;  
    }
    //creating three arg constructor  
    Student2(int id,String name,int age)
    {  
       this.id = id;  
       this.name = name;  
       this.age=age;  
    }  
    void show()
    { 
	System.out.println(id+" "+name+" "+age);
    }  
   
    public static void main(String args[])
    {  
        Student2 s1 = new Student2(100,"Ram");
        Student2 s2 = new Student2(200,"Rahim",18);
        s1.show();
        s2.show();
    }  
}

请看输出:

Constructor Overloading

Java 拷贝构造函数

在Java中没有复制构造函数。然而,我们可以像C++中的复制构造函数一样将一个对象的值复制到另一个对象。

在Java中,有许多方法可以将一个对象的值复制到另一个对象。它们是以下几种:

  1. 通过构造函数
  2. 通过将一个对象的值分配给另一个对象

例1:在这里, 我们将使用Java构造函数把一个对象的值复制到另一个对象中:

// Student3.java

//Java program to initialize the values from one object to another class Student3
{  
    int id;  
    String name;  
    //constructor to initialize integer and string  
    Student3(int id,String name)
    {  
       this.id = id;  
       this.name = name;  
    }  
    //constructor to initialize another object  
    Student3(Student3 s)
    {  
       this.id = s.id;  
       this.name = s.name;  
    }  
    void show()
    {
	 System.out.println(id+" "+name);
    }  
   
    public static void main(String args[])
    {  
        Student3 s1 = new Student3(100,"Ram");  
        Student3 s2 = new Student3(s1);  
        s1.show();  
        s2.show();  
    }
}

请看输出结果:

Java Copy Constructor

例2:我们可以通过把一个对象的值赋给另一个对象来把它的值复制到另一个对象。在这种情况下,不需要创建构造函数。

请看下面的代码:

// Student4.java

class Student4
{  
    int id;  
    String name;  
    Student4(int id,String name)
    {  
       this.id = id;  
       this.name = name;  
    }  
    Student4()
    {
		
    }  
    void show()
    {
       System.out.println(id+" "+name);
    }  
   
    public static void main(String args[])
    {  
       Student4 s1 = new Student4(100,"Ram");  
       Student4 s2 = new Student4();
       s2.id=s1.id;
       s2.name=s1.name;  
       s1.show();  
       s2.show();  
    }  
}

请看输出:

Java Constructor example

构造函数和方法的区别

  1. 构造函数的目的是初始化类的对象,而方法的目的是通过执行java代码来执行该任务。
  2. 构造函数不能是抽象的、最终的、静态的和同步的,而方法可以是抽象的、最终的、静态的和同步的。
  3. 构造函数没有返回类型,而方法有。

本教程到此为止。