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;
    }
    
}
  • 说明:
    1. 构造器明必须和类名相同
    2. 构造器没有返回值,所以不需要返回值类型,也不需要void
    3. 构造器的修饰符只能是4种权限修饰符,不能被其他修饰符修饰
    4. 当我们没有显示声明构造器时,系统会自动提供一个无参构造器,当我们显示定义构造器后,系统就不再提供无参构造器了
    5. 在类中,至少存在一个构造器
    6. 构造器是可以重载的

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(参数列表)"
posted @ 2025-01-02 00:36  -Miao酱-  阅读(6)  评论(0编辑  收藏  举报