Java构造器

在 Java 中,可以通过编写构造器来确保每个对象的初始化。但是这里有两个问题:

  1. 这个构造器使用的任何名字都有可能与类里某个成员相冲突;
  2. 编译器负责调用构造器,所以它必须始终知道应该调用哪个方法。

构造器的作用是用来建立一个新的类的实例,当一个对象被创建时,JVM 使用一个构造函数,并为其分配内存空间。

public class Person {
    public Person() {
    }
}    

例如,在下面的示例中,我们创建了一个名为Person的构造方法。在构造函数方法,我们正在初始化 age 变量的值。

public class Person {

    int age;

    public Person() {
        age = 10;
    }

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.age);
    }
}    

注意创建 Person类的对象的语句:Person person = new Person();此时为无参构造,打印的值为10;

构造器目的

构造函数的目的是初始化对象的状态,为所有声明的属性赋值。如果我们没有自定义构造函数,JVM 就会为这些属性分配默认值

构造器分类

在 Java 中,有三种类型的构造器:

    无参构造器

    有参构造器

    默认构造器

无参构造器

构造方法内可能有参数,也可能没有任何参数。如果构造函数不接受任何参数,则称为无参数构造器。例如上述代码中 Person 构造器

    public Person() {
        age = 10;
    }

有参构造器

具有参数的构造器,可用于为不同对象提供不同值

    String name;

    public Person(String name) {
        this.name = name;
        System.out.println("名字:"+name);
    }

    public static void main(String[] args) {
        Person person1 = new Person("小赵");
        Person person2 = new Person("小钱");
        Person person3 = new Person("小孙");
        Person person = new Person("小李");
    }

运行结果:

默认构造器

如果我们不创建任何构造函数,Java 编译器会在程序执行期间自动创建一个无参数构造函数。

 

 

原生方法和构造器的区别

  • 构造函数必须与在 Java 中定义的类具有相同的名称
  • 当方法没有返回任何值时,构造函数不会返回任何类型,而方法则具有返回类型或 void
  • 在对象创建时,仅调用构造函数一次,而方法可以被调用任何次数

如果我们不用构造器来给属性赋值的话,可以先使用 new 运算符获取类的实例,并使用类的 setter 方法设置值,如下:

import java.util.Arrays;

public class Person {

    private String name;
    private int age;

    public String toString(){
        return Arrays.asList(name,String.valueOf(age)).toString();
    }
    public void setName(String name){
        this.name = name;
    }
    public void setAge(int age){
        this.age = age;
    }
}
class Main
{
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("小赵");
        person.setAge(22);
        System.out.println(person);
    }
}

通过构造器进行初始化就可以省去我们的 setter 方法:

import java.util.Arrays;

public class Person {

    private String name;
    private int age;

    public Person(String name,int age){
        this.age = age;
        this.name = name;
    }
    public String toString(){
        return Arrays.asList(name,String.valueOf(age)).toString();
    }
}

class Main
{
    public static void main(String[] args) {
        Person person = new Person("小赵",22);
        System.out.println(person);
    }
}

运行结果:同为  [小赵, 22]

构造器重载

与 Java 方法重载类似,我们也可以创建两个或多个具有不同参数的构造函数。这称为构造函数重载。

public class Person {

    String name;

    public Person(){
        this.name = "小王";
    }

    public Person(String name){
        this.name = name;
    }

    public void getName(){
        System.out.println("姓名:"+this.name);
    }

    public static void main(String[] args) {

        Person person1 = new Person();
        Person person2 = new Person("小赵");

        person1.getName();
        person2.getName();
    }
}

运行结果:

拷贝构造器

Java 中的拷贝构造方法是一种使用该类的一个对象构造另外一个对象的构造方法。

复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象的副本。它只需要一个参数,它将是同一类的另一个实例。我们可以使用 this () 语句从复制构造函数中显式调用另一个构造函数:

public class Person {

    private String name;

    public Person(String name){
        this.name = name;
    }

    public Person(Person person){
        this.name = person.name;
    }


    public void getName(){
        System.out.println("名字:"+this.name);
    }

    public static void main(String[] args) {

        Person person0 = new Person("小赵");
        Person person1 = new Person(person0);

        person0.getName();
        person1.getName();
    }
}

运行结果:

名字:小赵
名字:小赵

快捷键

Alt+Ins

 

posted @ 2022-09-20 23:18  ywwwik  阅读(167)  评论(0编辑  收藏  举报