Java继承讲解(第二节)super和this用法的辨析

书接上回Java继承讲解(第一节)-CSDN博客​​​​​​

我们引出了super关键字我们通过对比的方法学习这个关键字

在Java中,superthis 是两个非常重要的关键字,主要用于访问类中的成员变量、方法以及构造方法。它们的作用各不相同,但都与类的继承关系实例化过程有关。接下来我将分别讲解 superthis个常用用法

 

一、super 关键字的三种用法

1. super 用于调用父类的成员变量

当子类和父类有同名的成员变量时,子类默认会隐藏父类的成员变量。要访问父类的同名成员变量,必须使用 super 关键字。

示例:
class Animal {
    public String name = "动物";
}

class Dog extends Animal {
    public String name = "狗";

    public void displayNames() {
        System.out.println("子类名字: " + name);        // 访问子类的name
        System.out.println("父类名字: " + super.name);  // 通过super访问父类的name
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.displayNames();
    }
}

运行结果:

子类名字: 狗
父类名字: 动物
解释
  • 通过 super.name,我们可以访问父类 Animal 中的成员变量 name,而 name 直接指向的是 Dog 类中的成员变量。

2. super 用于调用父类的成员方法

当子类重写了父类的方法时,默认调用的是子类的方法。如果我们想要在子类中调用父类的版本,可以使用 super 关键字。

示例:
class Animal {
    public void eat() {
        System.out.println("动物正在吃东西");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗正在吃东西");
    }

    public void displayEat() {
        super.eat();  // 调用父类的eat方法
        eat();        // 调用子类的eat方法
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.displayEat();
    }
}

运行结果:

动物正在吃东西
狗正在吃东西
解释
  • super.eat() 调用了父类 Animaleat() 方法,而 eat() 则是子类 Dog 自己重写的方法。

3. super 用于调用父类的构造方法

在子类的构造方法中,默认会调用父类的无参构造方法。如果父类有参数构造方法,我们可以使用 super() 来显式调用父类的构造方法。

示例:
class Animal {
    public Animal(String name) {
        System.out.println("父类构造方法,动物的名字是: " + name);
    }
}

class Dog extends Animal {
    public Dog() {
        super("狗");  // 调用父类的带参构造方法
        System.out.println("子类构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

运行结果:

父类构造方法,动物的名字是: 狗
子类构造方法
解释
  • super("狗") 显式调用了父类的带参构造方法,并传递参数 "狗",这确保在子类构造方法执行之前,父类的构造方法能够先执行。

二、this 关键字的三种用法

1. this 用于访问当前对象的成员变量(this.成员变量)

当方法的参数名与成员变量名相同,成员变量会被隐藏,此时可以使用 this 关键字来区分参数和当前对象的成员变量。

示例:
class Dog {
    private String name;

    public Dog(String name) {
        this.name = name;  // 使用this来区分成员变量和参数
    }

    public void display() {
        System.out.println("狗的名字是: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("小黑");
        dog.display();
    }
}

运行结果:

狗的名字是: 小黑
解释
  • this.name = name; 中的 this.name 表示当前对象的成员变量 name,而右边的 name 是构造方法的参数。

2. this 用于调用当前类的其他方法(this.方法)

this 可以在一个方法中调用当前对象的另一个方法。这样可以避免重复代码,并且保证调用的都是当前对象的方法。

示例:
class Dog {
    public void bark() {
        System.out.println("狗在叫");
    }

    public void play() {
        this.bark();  // 调用当前类的bark方法
        System.out.println("狗在玩");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.play();
    }
}

运行结果:

狗在叫
狗在玩
解释
  • this.bark() 显式调用了 bark() 方法。虽然可以直接调用 bark() 方法而不使用 this,但 this 关键字明确表明了调用的是当前对象的 bark() 方法。

3. this 用于调用当前类的构造方法  this( )    

在一个构造方法中,可以使用 this() 调用当前类的另一个构造方法,以避免重复初始化代码。注意:this() 必须是构造方法中的第一条语句

示例:
class Dog {
    private String name;
    private int age;

    // 调用带一个参数的构造方法
    public Dog(String name) {
        this(name, 0);  // 调用另一个构造方法
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void display() {
        System.out.println("狗的名字是: " + name + ", 年龄是: " + age);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("小黑");
        dog.display();
    }
}

 运行结果:

狗的名字是: 小黑, 年龄是: 0
解释
  • Dog(String name) 构造方法中,使用了 this(name, 0) 来调用带两个参数的构造方法,这避免了重复初始化代码。

三、superthis 的区别

特性thissuper
作用对象当前类的对象(即自身)父类的对象
访问成员访问当前类的成员变量或成员方法访问父类的成员变量或成员方法
构造方法调用调用当前类的其他构造方法调用父类的构造方法
调用顺序限制this() 必须是构造方法的第一行语句super() 也必须是构造方法的第一行语句
多态性当前对象的引用父类对象的引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值