上一篇博客小编已经给读者介绍了Java入门的类与对象,这一章节我们来了解一下构造方法,方法重载以及this关键字。
一:构造方法
Java中方法一般有2中:普通方法和构造方法。我们已经知道普通方法的声明格式为:
访问修饰符 返回值类型 方法名(数据类型 参数名,...){
方法体……
}
那么构造方法的声明格式又是怎样的呢?
访问修饰符 构造方法名(数据类型 参数名,...){
方法体……
}
上面就是构造方法的声明格式,通过对比我们发现2种方法有不同的地方,我们需要牢记一下几点:
1.构造方法在声明处没有返回值类型。因此,在构造方法的方法体中不能使用return语句来返回一个值。
2.构造方法的方法名必须与类名一致。也就是说构造方法名就是类名,不能是其他名字。
在上一节介绍类与对象中,实例化对象的格式为:
类名 对象名 = new 类名(参数值,...);
而在介绍了构造方法后,我们需要修改实例化对象的格式:
类名 对象名 = new 构造方法名(参数值,...);
也就是说,在实例化对象的过程中,我们调用了构造方法,将括号内的参数传到构造方法的方法体中,调用构造方法的作用是什么呢?既然实例化了一个对象 ,我们肯定希望给这个对象赋予一定的属性,调用构造方法的作用,就是给对象的属性设置初始值。
来看一个例子。我们创建一个Student类,在类中写一个构造方法,然后输出一行字:
public class Student {
private String name;//name这个属性设为private型,即只能在本类中被访问
//声明一个构造方法
public Student(String name) {
this.name = name;
System.out.println(this.name + "正在学习Java!");
}
}
在创建一个Manager类,用来创实例化一个Student类的对象:
public class Manager {
public static void main(String[] args) {
//实例化对象:类名 对象名 = new 构造方法名(参数值,...);
Student stu = new Student("张三");
}
}
在Manager类中实例化对象的时候,调用Student类中的构造方法Student(String name);并且将张三这个参数赋给name,然后执行构造方法中的代码,将name赋给this.name,接着输出一行字,输出结果为:
张三正在学习Java!
可以看到,我们在创建一个对象stu的时候,调用了构造方法,给对象的name属性设置了一个初始值:张三。
补充:如果没有在类中定义构造方法,那么JVM会默认给你提供一个构造方法(无参数的构造方法);如果你在类中定义了构造方法,则JVM不会提供默认的构造方法了。
二:方法重载
我们先创建一个Student类:
public class Student {
public String name;
public Student() {
System.out.println("无参数的构造方法");
}
public Student(String name) {
this.name = name;
System.out.println("有参数的构造方法");
}
}
然后创建一个Manager类,实例化对象:
public class Manager {
public static void main(String[] args) {
//类名 对象名 = new 构造方法名();
Student stu = new Student();
System.out.println(stu.name + "正在学习Java!");
//类名 对象名 = new 构造方法名(参数值,……);
Student stu2 = new Student("张三");
System.out.println(stu2.name + "正在学习Java!");
}
}
我们来看看代码执行的结果:
无参数的构造方法
null正在学习Java!
有参数的构造方法
张三正在学习Java!
读者一定有很多疑惑,让我们来分析分析为什么是这样的执行结果吧!
首先,在Java中,代码是从上往下执行的,即先执行上一行的语句,然后按顺序执行下面的语句。在Manager类中,我们先是创建了一个stu对象,根据刚刚介绍的构造方法的内容,在创建这个对象的时候,我们调用了Student类中的Student();这个构造方法,调用这个方法就要执行方法中的语句,所以输出"无参数的构造方法";
在创建stu对象的语句后面是一个输出语句,因此调用完Student()方法后,就会输出"null正在学习",为什么是null呢?因为Student()方法的括号没有参数,this.name并没有被赋值,因此输出null;
接着,我们又创建了一个stu2的对象,这里我们调用的是Student("张三");这个方法,因为括号内有一个参数值"张三",因此调用的是Student(String name)这个方法,并将"张三"赋给name,然后执行this.name = name;System.out.println("有参数的构造方法");因此输出"有参数的构造方法";创建stu2的语句后面又是一个输出语句,执行后输出为"张三正在学习Java!"。
在Student类中,我们声明了2个构造方法,这2个方法的方法名一致(都是Student),但是参数个数、参数类型不同(一个有参数,一个没有参数),我们把这叫做方法的重载。
概括的的说,方法重载有一下条件:
1.必须在同类中或者是有继承关系的类中;
2.方法名必须要完全一致;
3.方法所带的参数(参数个数、参数类型、参数顺序)必须要不同。
三:this关键字
在上面我们的this.name中我们已经看到了this关键字,那么为什么要用this关键字呢?
如果我们把代码this.name = name;改为name = name;那么Java系统无法判断哪一个是Student(String name)方法中的参数name,哪一个是属性name;因此需要加一个this.name来区分,this.name表示属性。
除此之外,this还有一个用途:用来调用当前类中中构造方法或者是普通方法。
调用构造方法的格式为:this(参数值,...);
调用普通方法的格式为:this.普通方法名(参数值,...);
this关键字到底表示的是谁呢?this表示当前调用方法的对象;如果是a对象在调用方法,那么方法中this就表示a对象。this就类似于生活中"我"这个词的意思。