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

本文详细阐述了Java中的构造器概念,解释了其在对象创建过程中的作用,以及如何通过默认构造方法和自定义构造方法进行实例化。讲解了构造方法的命名规则、参数列表和方法重载的重要性。阅读者将了解如何避免编译器错误并确保代码的可读性。
摘要由CSDN通过智能技术生成

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());

}

}

运行结果如下:

b563a00e3e031ee49268aef0c46bf686.png

此时在创建对象的时候,参数 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();

}

}

// 注意此代码会报错 这里只是栗子

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

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

总结:

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

本文由 @常刚亮[Vip] 发布于 职涯宝 ,未经作者许可,禁止转载,欢迎您分享文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值