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();
}
}
// 注意此代码会报错 这里只是栗子
这时候,恐怕是你都不知道要调用的是谁了吧;就比如你叫双胞胎:"嘿,长得帅的宝贝,来我这里领糖吃了";他俩可能会因为谁长的帅而打起来吧。
因为构造方法也是方法,他同样可以被重载,所以这样写就理所当然了啊。
总结:
构造方法在类中的地位就等于一人之上万人之下吧(哈哈,脑补出了画面),本篇为看过编程思想后的一些小理解,简单记录一下(由于刚开始写博客,可能写的有点乱),同时分享一下,如有错误,欢迎指出,一定及时改正!