简单理解Java的构造器(构造方法)(笔记)

1、什么是构造器?

    在Java中,函数通常被称为方法(只是一种叫法,按个人习惯来);而所谓的构造器,也就是一种特殊的方法(不要被构造器这么高大上的名字吓到了)。

2、构造方法的具体用处与使用

引入:

new对象的过程,实际上是调用的类中的默认的构造方法;这时你可能就有疑问了,如果是调用的方法,那创建一个类的时候并没有去创建一个所谓的构造方法啊?怎么就能直接调用了呢?比如下面一段代码

public class Student {
    private String username;
    private String password;
    // 省略了setter getter方法
}

这段程序出了两个字段,什么也没有,但是当你需要操作这些字段的时候,只需要直接new Student() 即可创建出来一个Student对象,然后打点调用setter方法进行操作私有变量即可。此处你之所以能成功创建一个对象,得益于编译器给你创建了个默认的构造方法;

当然你可以手动去创建一个构造方法:

public class Student {
    private String username;
    private String password;
    // 构造方法
    public Student(){
        
    }
}
  • 构造方法的创建规则

    规定:构造方法的方法名必须和类名相同(这种命名方式是为了让编译器更容易辨别哪个是构造方法,如果给构造方法起别的名字,难免会和某个字段或方法重名;在初始化期间要自动调用构造方法。所以使用和类名相同的名称,是一种非常不错的选择),且不带返回值(这里的意思不是返回值类型为void),即 权限修饰符+类名(){}

权限修饰符可以为任意的修饰符,但是默认的为public,如果修饰符改为private,则对象不能在外部被创建(这里不考虑反射)。

当然构造方法也可以和普通方法一样,拥有参数列表,如下:

public class Student {
    private String username;
    private String password;
    
    public Student(String username,String password){
        this.username = username;
        this.password = password;
    }
    // 省略setter getter方法
}

this 关键字是为了区分形参和字段的,我把它记为就远原则,即this打点的变量离哪个远,指的就是哪个变量

此时,构造方法就有了参数,接下来测试一下这个构造方法

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student("user","123");
        System.out.println("username:" + student.getUsername());
        System.out.println("password:" + student.getPassword());
    }
}

运行结果如下:

此时在创建对象的时候,参数 user 和 123 通过构造方法赋值给了字段。

当然,这时如果在执行以下写出以下代码,就会出错

Student stu = new Student();

因为当你自己创建时,编译器会当围观群众:"哟呵,大家快来看啊,这货自己写构造方法了,终于让我放松一下了,每次都提供默认的,快把我给累趴了";

这时如果你习惯了编译器提供的默认构造方法的话,你可以会直接去写上边的代码;

此时你的编译环境也不乐意了:"连个无参(默认)构造方法都没有,你写的是什么啊?你不给我无参构造方法,还想通过我这关去拿内存?做梦去吧";

而你则一脸懵的看着那刺眼的红色波浪线发愁:"以前都没事,咋这次不行了呢?"

所以为了避免被鄙视,我们需要自己把无参(默认)构造方法给写出来才行;

不是说一个方法名在一个类中只能出现一次吗?咋还写两个了呢?那不更被鄙视吗?

  • 方法重载

为了方便我们,写jdk的大牛们,发明了方法重载;

怎么区分重载方法呢?

这就像双胞胎一样,看似长得一样,却也有自己独一无二的地方;即使长得再想,妈妈们总有办法一眼认出。而编译器就像妈妈一样,能慧眼识真假。

方法重载的规则:

每个重载的方法都必须要有一个独一无二的参数列表,方法名必须相同,就像双胞胎一样,但是参数列表不同,就像双胞胎的不同之处。

对于一个方法来说,可能没有更好的方法去区分同名的方法了吧。"嗯哼?" "你确定吗?" "当然确定啊"

那参数的顺序不能区分吗?

当然可以啊,但是如果这么设计,恐怕那些大牛们会被鄙视吧。

Java的基本类型,能把一个"较小"的数据类型自动提升为一个"较大"的类型(当然其他语言也可能会自动转换),如果参数列表为基本类型,传入的数据又十分的极端,那编译器估计会疯掉。

那....那用返回值来区分总没问题了吧?

嗯....好像是可以。但是你有没有想过一件事,如果不需要这个方法的返回值呢?只是需要某个方法的某些功能,比如打印语句(举个栗子),只是简单的去调用一下,并没有去接收返回值,那编译器又不知道调用的是哪个方法了

比如下面的栗子:

public class Test{
    void m1(){}

    int m1(){
        return 0;
    }
    public static void main(String[] args){
        Test t = new Test();
        t.m1();
    }
}
// 注意此代码会报错 这里只是栗子


这时候,恐怕是你都不知道要调用的是谁了吧;就比如你叫双胞胎:"嘿,长得帅的宝贝,来我这里领糖吃了";他俩可能会因为谁长的帅而打起来吧。

因为构造方法也是方法,他同样可以被重载,所以这样写就理所当然了啊。

总结:

    构造方法在类中的地位就等于一人之上万人之下吧(哈哈,脑补出了画面),本篇为看过编程思想后的一些小理解,简单记录一下(由于刚开始写博客,可能写的有点乱),同时分享一下,如有错误,欢迎指出,一定及时改正!

猜你喜欢

转载自blog.csdn.net/weixin_44231805/article/details/109136071