Java 构造器和this关键字
1. 类的成员:构造器(Constructor)
在之前的程序中,我们面向对象程序设计的思路是定义类,实例化类(new对象),对象调用类的属性或方法。在实例化类时,我们需要为成员变量赋值,如果一个一个赋值就太繁琐了,是否可以在new时就直接赋值呢,答案是当然可以。构造器,又称构造方法,便实现了这种功能。
public class Person{
private String name;
private int age;
// 无参构造函数
public Person(){}
// 有参构造函数
public Person(String n, int a){
name = n;
age = a;
}
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
public int getAge(){
return a;
}
public void setAge(int a){
age = a;
}
}
- 说明:
- 构造器明必须和类名相同
- 构造器没有返回值,所以不需要返回值类型,也不需要void
- 构造器的修饰符只能是4种权限修饰符,不能被其他修饰符修饰
- 当我们没有显示声明构造器时,系统会自动提供一个无参构造器,当我们显示定义构造器后,系统就不再提供无参构造器了
- 在类中,至少存在一个构造器
- 构造器是可以重载的
2. 关键字:this
之前我们讲过构造器和set方法,代码如下
public class Person{
private String name;
private int age;
// 无参构造函数
public Person(){}
// 有参构造函数
public Person(String n, int a){
name = n;
age = a;
}
// get、set方法
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
public int getAge(){
return a;
}
public void setAge(int a){
age = a;
}
}
我们可以看到,有参构造函数和set方法是通过形参给成员变量赋值的,形参和实参(成员变量)名称是不同的,但是如果相同呢,该如何区分这两种变量?答案就是使用this关键字。代码如下
class Person{
private String name;
private int age;
// 无参构造函数
public Person(){}
// 有参构造函数
public Person(String name, int age){
this.name = name;
this.age = age;
}
// get、set方法
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return a;
}
public void setAge(int age){
this.age = age;
}
}
this是什么?
答:this关键字在实例方法和构造器种使用,表示当前的对象。
this何时用?
答:如果当形参和成员变量同名时,在方法内或者构造器内需要使用该成员变量,就需要加this关键字来表明该变量是类的成员变量。即this关键字可以区分成员变量和局部变量;另外,this也可以作为一个类中构造器相互调用的特殊格式
class Person{
private String name;
private int age;
// 无参构造函数
public Person(){}
// 有参构造函数
public Person(String name, int age){
this.name = name;
this.age = age;
}
// get、set方法
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return a;
}
public void setAge(int age){
this.age = age;
}
public void eat(){
System.out.println("人需要吃饭");
this.sleep();
}
public void sleep(){
System.out.println("人需要睡觉");
}
}
this也可以作为一个类中构造器相互调用的特殊格式
- this() 调用本类的无参构造器
- this(实参列表) 调用本类的有参构造器
public class Student {
private String name;
private int age;
// 无参构造
public Student() {
// this("",18);//调用本类有参构造器
}
// 有参构造
public Student(String name) {
this(); //调用本类无参构造器
this.name = name;
}
// 有参构造
public Student(String name,int age){
this(name); //调用本类中有一个String参数的构造器
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public voidg getInfo(){
System.out.println("姓名:" + name + "年龄:" + age);
}
}
注意:
- 不能出现递归调用。比如,调用自身构造器。
- this()和this(实参列表)只能声明在构造器首行。所以在类的一个构造器中,最多只能声明一个"this(参数列表)"