Java构造器,一文带你了解

简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 前言 理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用。 在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(constructor) 的概念,这是一个在创建对象时被自动调用的特殊方法。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


前言

理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用。

在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(constructor) 的概念,这是一个在创建对象时被自动调用的特殊方法。Java也采用了构造器。

一、构造器的引入

引入构造器帮助我们解决了哪些问题呢?假设我们每定义一个类都必须定义一个initialize()方法,该方法提醒你,每次使用对象之前都要执行一次该方法,这意味着用户每次都必须记得自己去调用此方法,这和上文提到的C程序员一样,很容易就忘记了。Java构造器的出现很好的规避掉了这种问题,创建对象时,java会在使用对象之前调用相应的构造器,保证对象正确初始化。

我们来看一个简单实例:

  public class TestMain {

    TestMain() {    //默认构造器
        System.out.println("默认构造器");
    }

    public static void main(String[] args) {
        new TestMain();
    }
}

//输出
默认构造器

从这个例子我们看到了,构造器为 TestMain() ,创建对象时,会分配内存并调用对应的构造方法,可以看到输出结果为 默认构造器 ,它已经被正确地初始化了。

二、构造器命名规则

从上面那个例子中或许已经观察到了:类名和构造器名必须相同,所以”每个方法首字母小写“的编码风格并不适用于构造器。

三、注意事项

  • 构造器必须与主类同名
  • 构造器可以有参数
  • 构造器可以重载
  • 没有返回值
  • 不添加构造器编译器生成默认构造器

四、默认构造器

默认构造器(又名无参构造器)是没有形式参数的,它创建的是”默认对象“。举个栗子:

public class TestMain {
    
    //没有指定构造器,Java编译器会自动生成默认构造

    public static void main(String[] args) {
        new TestMain();
    }
}

//输出

new TestMain()创建了一个新对象,并调用了默认构造——虽然我们并没有主动定义它。Java规定了,如果没有构造会生成默认构造,如果存在了一个及以上的构造便不会自动生成。

public class TestMain {
    
    TestMain(int i) {}
    TestMain(float f) {}

    public static void main(String[] args) {
        TestMain t1 = new TestMain();    //会报错,没有对应的构造方法
        TestMain t2 = new TestMain(1);
        TestMain t3 = new TestMain(2.0f);
    }
}

//输出

new TestMain()编译器会报错,因为我们没有定义对应的无参构造方法,编译器无法顺利创建对象。如果你没有定义构造器,编译器会认为”你需要一个构造器,我帮你造一个“;如果你自己写了一个构造器,编译器会认为”你已经有构造器了,你知道自己在做什么,我不帮你生成“。

五、构造方法重载

有默认无参构造,就有带参构造;有带参构造也就会发生方法重载。为了满足不同的初始化需求,我们通常会需要定义多个带参构造器,由于都是构造器,它们的名称必须相同,为了让方法名相同而参数不同的方法存在,我们就必须使用 方法重载 。它是构造器所必须的。

public class TestMain {

    TestMain() {
        System.out.println("默认构造");
    }

    TestMain(int i) {
        System.out.println("int带参构造");
    }

    TestMain(float f) {
        System.out.println("float带参构造");
    }

    public static void main(String[] args) {
        TestMain t1 = new TestMain();
        TestMain t2 = new TestMain(1);
        TestMain t3 = new TestMain(2.0f);
    }
}

//输出
默认构造
int带参构造
float带参构造

从上述代码中我们可以看到,类中定义了三个不同的构造方法,main方法中,在括号里传递不同的参数,编译器会根据参数的类型寻找对应的构造方法,从而初始化三个不同的对象,这就是构造方法的重载。

涉及基本类型的重载

在使用构造方法的重载时,我们经常会遇到将基本类型传递给重载方法时的一些问题。基本类型可以从一个 较小(窄类型) 类型自动提升(转型)为一个 较大(宽类型) 类型,当涉及到方法重载时便会造成一些混淆。举个栗子:

public class TestMain {

    TestMain(int i) {
        System.out.println("int带参构造");
    }

    TestMain(long l) {
        System.out.println("long带参构造");
    }

    TestMain(double d) {
        System.out.println("double带参构造");
    }

    public static void main(String[] args) {
        TestMain t1 = new TestMain(2.0f);
        TestMain t2 = new TestMain('菌');
    }
}

//输出
double带参构造
int带参构造

首先,我们来看一看t1对象,创建对象时传递的参数是一个float类型的数据,但是结果却显示调用了double带参构造,这是咋回事?其实在创建对象时,编译器会根据传递参数的类型自动寻找参数类型对应的构造方法,如果没有一模一样的构造方法,就会寻找类型更“宽”的构造方法。t1就是典型的例子,double类型比float更“宽”(float占4字节,double占8字节),所以会把传递的参数提升。

再来看t2对象,这个对象传递的是char类型数据,对于char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-06-10
本文作者:Aime菌
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
4月前
|
Java
【反射】Java反射机制 -- 常用构造器与方法
【反射】Java反射机制 -- 常用构造器与方法
28 0
|
4月前
lombok在生成的构造器、方法及参数上生成注解
lombok在生成的构造器、方法及参数上生成注解
61 0
|
2月前
|
人工智能 运维 Java
Java8新特性:方法引用与构造器引用
Java8新特性:方法引用与构造器引用
33 0
|
3月前
|
Java API
Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
43 0
|
3月前
|
存储 Java 数据库连接
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段4
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段
24 0
|
3月前
|
Java API
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段3
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段
35 0
|
3月前
|
Java 应用服务中间件 API
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段1
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段1
67 0
|
3月前
|
存储 Java 编译器
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段2
Java 编程问题:七、Java 反射类、接口、构造器、方法和字段2
50 0
|
7月前
|
Java 编译器
Java构造方法(构造器)
1.什么是构造方法? 2.构造方法的使用
64 0
|
8月前
|
Java
java8新特性:方法引用与构造器引用
java8新特性:方法引用与构造器引用
37 0

热门文章

最新文章