Java 构造函数

Java 构造函数

Java构造函数或Java中的构造器是一个术语,用于在我们的程序中构造一些东西。Java中的构造器是一种 特殊的方法 ,用于初始化对象。当一个类的对象被创建时,构造函数被调用。它可以用来设置对象属性的初始值。

在Java中,构造函数是一个类似于方法的代码块。当类的一个实例被创建时,它被调用。在调用构造函数的时候,对象的内存被分配到内存中。它是一种特殊类型的方法,用于初始化对象。每次使用new()关键字创建一个对象时,至少有一个构造函数被调用。

注意: 没有必要为一个类写一个构造函数。因为如果你的类没有构造函数,java编译器会创建一个默认的构造函数(无参数的构造函数)。

构造函数与Java中的方法有什么不同

  • 构造函数必须与它所定义的类有相同的名称,而Java中的方法则没有必要。
  • 构建器不返回任何类型,而方法有返回类型,如果不返回任何值,则为 void
  • 构建器在对象创建时只被调用一次,而方法可以被调用任意次数。

现在让我们想出在创建对象或实例时调用构造器的语法。

class Geek
{   
  .......

  // A Constructor
  Geek() {
  }

  .......
}

// We can create an object of the above class
// using the below statement. This statement
// calls above constructor.
Geek obj = new Geek(); 

构造函数的第一行是对super()或this()的调用,(对超类的构造函数或重载的构造函数的调用),如果你没有在你的构造函数中输入对super的调用,编译器会在你代码的第一行提供对super的非参数调用,必须调用super构造函数来创建一个对象。

import java.io.*;
 
class Geeks {
    Geeks() { super(); }
    public static void main(String[] args)
    {
        Geeks geek = new Geeks();
    }
}

输出
“`java

<pre><code class=" line-numbers"><br />如果你认为你的类不是一个子类,它实际上是,java中的每个类都是一个类 **对象** 的子类,即使你在类的定义中没有说extends object。

## 构造函数的必要性

想一想一个盒子。如果我们谈论一个盒子类,那么它将有一些类的变量(比如长度、宽度和高度)。但是当我们要创建它的对象时(即盒子现在存在于计算机的内存中),那么一个盒子可以在没有定义其尺寸值的情况下存在吗?答案是否定 **的。**
所以构造函数是用来在创建对象时给类变量赋值的,可以由程序员明确完成,也可以由Java本身完成(默认构造函数)。

### 构造函数什么时候被调用

每次使用 **new()** 关键字创建一个对象时,至少有一个构造函数(可以是默认构造函数)被调用,以便为同一类别的 **数据成员** 分配初始值。

编写构造函数的规则如下。

* 一个类的构造函数必须与它所在的类的名称相同。
* Java中的构造函数不能是抽象的、最终的、静态的或同步的。
* 在构造函数声明中可以使用访问修饰符来控制它的访问,即哪些其他类可以调用该构造函数。

到目前为止,我们已经知道构造函数是用来初始化对象的状态的。像方法一样,构造函数也包含了在创建对象时执行的语句(即指令)的集合。

## Java中构造函数的类型

现在是讨论构造函数类型的正确时机,所以在Java中主要有两种构造函数类型。

* **无参数构造函数**
* **参数化** 构造函数
* **默认构造函数**

### 1.无参数构造器

一个没有参数的构造函数被称为无参数或零参数构造函数。如果我们不在一个类中定义一个构造函数,那么编译器就会为该类创建一个 **构造函数(没有参数)** 。如果我们写了一个有参数或无参数的构造函数,那么编译器就不会创建一个默认的构造函数。

**注意:** 默认构造函数为对象提供默认值,如0、null,等等,这取决于类型。

**例子**
“`java
// Java Program to illustrate calling a
// no-argument constructor
 
import java.io.*;
 
class Geek {
    int num;
    String name;
 
    // this would be invoked while an object
    // of that class is created.
    Geek() { System.out.println(“Constructor called”); }
}
 
class GFG {
    public static void main(String[] args)
    {
        // this would invoke default constructor.
        Geek geek1 = new Geek();
 
        // Default constructor provides the default
        // values to the object like 0, null
        System.out.println(geek1.name);
        System.out.println(geek1.num);
    }
}

输出

Constructor called
null
0

2.参数化构造函数

一个有参数的构造函数被称为参数化构造函数。如果我们想用自己的值来初始化类的字段,那么就使用参数化构造函数。

例子

import java.io.*;
class Geek {
    // data members of the class.
    String name;
    int id;
    Geek(String name, int id)
    {
        this.name = name;
        this.id = id;
    }
}
class GFG {
    public static void main(String[] args)
    {
        // This would invoke the parameterized constructor.
        Geek geek1 = new Geek("avinash", 68);
        System.out.println("GeekName :" + geek1.name  + " and GeekId :" + geek1.id);
    }
}

输出

GeekName :avinash and GeekId :68

记住:构造函数是否返回任何值?

在构造函数中没有 “返回值 “语句,但构造函数会返回当前的类实例。我们可以在构造函数里面写 “返回”。

现在,最重要的话题是将OOPS与构造函数紧密结合在一起,称为构造函数重载。就像方法一样,我们可以重载构造函数,以不同的方式创建对象。编译器会根据参数的数量、参数的类型和参数的顺序来区分构造函数。

例子

// Java Program to illustrate constructor overloading
// using same task (addition operation ) for different
// types of arguments.
 
import java.io.*;
 
class Geek {
    // constructor with one argument
    Geek(String name)
    {
        System.out.println("Constructor with one "
                           + "argument - String : " + name);
    }
 
    // constructor with two arguments
    Geek(String name, int age)
    {
 
        System.out.println(
            "Constructor with two arguments : "
            + " String and Integer : " + name + " " + age);
    }
 
    // Constructor with one argument but with different
    // type than previous..
    Geek(long id)
    {
        System.out.println(
            "Constructor with one argument : "
            + "Long : " + id);
    }
}
 
class GFG {
    public static void main(String[] args)
    {
        // Creating the objects of the class named 'Geek'
        // by passing different arguments
 
        // Invoke the constructor with one argument of
        // type 'String'.
        Geek geek2 = new Geek("Shikhar");
 
        // Invoke the constructor with two arguments
        Geek geek3 = new Geek("Dharmesh", 26);
 
        // Invoke the constructor with one argument of
        // type 'Long'.
        Geek geek4 = new Geek(325614567);
    }
}

输出

Constructor with one argument - String : Shikhar
Constructor with two arguments :  String and Integer : Dharmesh 26
Constructor with one argument : Long : 325614567

3.缺省构造函数

一个没有参数的构造函数被称为默认构造函数。默认构造函数是不可见的。如果我们写一个有参数或无参数的构造函数,那么编译器就不会创建一个默认的构造函数。它被取出来了。它被重载并称为参数化构造函数。默认构造函数变成了参数化构造函数。但参数化构造函数不能改变默认构造函数。

import java.io.*;
 
class GFG {
    GFG() { System.out.println("Default constructor"); }
    public static void main(String[] args)
    {
 
        GFG hello = new GFG();
    }
}

输出

Default constructor

为了深入了解构造函数,有两个概念被广泛使用,如下所示。

  • 构造函数链
  • 复制构造函数

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程