【JavaSE专栏57】妙用this和super关键字,让父类和子类之间来回自如

简介: 【JavaSE专栏57】妙用this和super关键字,让父类和子类之间来回自如


一、this关键字

在 Java 中,this 关键字是一个引用,它代表当前对象的引用,它可以在类的成员方法和构造方法中使用。

this 关键字主要有以下 3 33 个作用,请同学们认真学习。

  1. 引用当前对象:当一个类的实例化对象调用自己的成员方法时,可以使用 this 关键字来引用当前对象。比如在类的方法中需要访问当前对象的成员变量或调用其他方法时,可以使用 this 关键字来明确指代当前对象。
  2. 解决变量名冲突:当方法的参数名和成员变量名相同时,使用 this 关键字可以区分成员变量和参数变量。例如,如果一个方法的参数名与成员变量名相同,使用 this 关键字可以明确指明成员变量。
  3. 调用构造方法:在一个构造方法中,可以使用 this 关键字调用同类的其他构造方法,这样可以避免重复代码,并且方便构造方法的重载使用。

提示:this 关键字只能在非静态的成员方法和构造方法中使用,不能在静态方法中使用,因为静态方法属于类级别,没有当前对象的引用。


二、super关键字

在 Java 中,super 关键字是一个引用,它用于引用父类的成员变量、方法和构造方法

super 关键字主要有以下 4 44 种用法,请同学们认真学习。

  1. 调用父类的构造方法:在子类的构造方法中,可以使用 super 关键字来调用父类的构造方法。这样可以在子类构造对象时,先执行父类的构造方法,确保父类的初始化工作完成。
  2. 调用父类的成员变量和方法:在子类中,如果父类和子类有同名的成员变量或方法,可以使用 super 关键字来引用父类的成员。通过 super 关键字,可以明确指定调用父类的成员,避免歧义。
  3. 调用父类的普通方法:在子类的方法中,可以使用 super 关键字来调用父类的普通方法。这样可以在子类中重写父类的方法,但又需要在子类的方法中调用父类的原始实现。
  4. 在内部类中使用:在内部类中,如果内部类和外部类有同名的成员变量或方法,可以使用 super 关键字来引用外部类的成员。通过 super 关键字,可以明确指定调用外部类的成员。

提示:super 关键字只能用于在子类中引用父类的成员,不能用于在父类中引用子类的成员。另外,super 关键字不能用于静态方法和静态代码块中,因为静态方法和静态代码块属于类级别,没有具体的对象实例。


三、this和super关键字的使用区别

this 关键字是用来引用当前对象的引用,而 super 关键字是用来引用父类对象的引用。

它们的使用区别如下,请同学们认真学习。

3.1 调用构造方法

  • this 关键字用于调用本类中的其他构造方法,用于构造方法的重载或构造方法之间的调用。
  • super 关键字用于调用父类的构造方法,用于子类构造方法中调用父类构造方法以完成父类的初始化。

以下是一个示例代码,请同学们复制到本地执行。

class Parent {
    private int age;
    public Parent(int age) {
        this.age = age;
    }
}
class Child extends Parent {
    private String name;
    public Child(int age, String name) {
        super(age); // 调用父类的构造方法
        this.name = name;
    }
}

3.2 引用成员变量和方法

  • this 关键字用于引用当前对象的成员变量和方法。
  • super 关键字用于引用父类的成员变量和方法。

以下是一个示例代码,请同学们复制到本地执行。

class Parent {
    protected int age;
    public void printAge() {
        System.out.println("Parent's age: " + age);
    }
}
class Child extends Parent {
    private int age;
    public Child(int age) {
        this.age = age; // 引用子类的age变量
        super.age = age; // 引用父类的age变量
    }
    public void printAge() {
        System.out.println("Child's age: " + age); // 引用子类的age变量
        super.printAge(); // 调用父类的printAge方法
    }
}

在上述示例代码中,子类 Child 中有一个与父类 Parent 同名的成员变量 age。通过 this 关键字和 super 关键字可以分别引用子类和父类的成员变量。

  1. 总结
  • this 关键字用于引用当前对象的成员变量和方法,以及调用本类中的其他构造方法。
  • super 关键字用于引用父类的成员变量和方法,以及调用父类的构造方法。


四、this、super面试题

一、this 关键字的作用是什么?举例说明。

答:this 关键字用于引用当前对象的引用,它主要有以下几个作用:

  • 引用当前对象的成员变量和方法;
  • 调用本类中的其他构造方法;
  • 返回当前对象的引用。例如:this.name 表示当前对象的 name 成员变量。

二、super 关键字的作用是什么?举例说明。

答:super 关键字用于引用父类对象的引用,它主要有以下几个作用:

  • 调用父类的构造方法;
  • 引用父类的成员变量和方法。例如:super.name 表示父类的 name 成员变量。

三、this和super关键字的区别是什么?

答:this 关键字用于引用当前对象的引用,super 关键字用于引用父类对象的引用,具体区别如下。

  • this 关键字用于引用当前类中的成员变量、方法和构造方法,而 super 关键字用于引用父类中的成员变量、方法和构造方法。
  • this 关键字用于解决成员变量和局部变量同名的问题,而 super 关键字用于解决子类与父类成员变量或方法同名的问题。
  • this 关键字只能在非静态的成员方法和构造方法中使用,而 super 关键字可以在子类的任意方法中使用。

四、当子类和父类有同名的成员变量时,如何使用 this 和 super 关键字区分?

答:当子类和父类有同名的成员变量时,可以使用 thissuper 关键字来区分。

  • 使用 this 关键字表示当前类的成员变量,例如:this.name 表示子类的name成员变量。
  • 使用 super 关键字表示父类的成员变量,例如:super.name 表示父类的name成员变量。

五、this 和 super 关键字能否同时出现在一个构造方法中?

答:是的,this 和 super 关键字可以同时出现在一个构造方法中。例如,通过 this 关键字调用本类的其他构造方法,再通过 super 关键字调用父类的构造方法,实现构造方法之间的调用关系。例如:this(...)super(...)


五、总结

本文讲解了 Java 中 this 和 super 关键字语法和应用场景,并给出了样例代码,在下一篇博客中,将讲解 Java 中构造函数语法和构造函数的优先级问题。


相关文章
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
5月前
|
Java
Java 继承魔法揭秘:子类如何“一键继承”父类超能力,还能再添新技能?!
【6月更文挑战第16天】Java继承如魔法,子类`SubPower`通过`extends SuperPower`一键继承父类`SuperPower`的特性,同时还可添加新方法。继承展现代码复用的魔力,子类调用`specialAbility()`时,既展示自身能力,又能触发父类的`commonAbility()`。这种深度关联增强程序灵活性,简化复杂系统的构建,开启无限编程可能。
43 0
|
5月前
|
Java
Java 继承:当子类遇见父类,一场“继承”与“创新”的浪漫邂逅
【6月更文挑战第16天】Java继承是OOP的关键,子类继承父类的属性和方法,实现代码复用与类层次结构。例如,`Student`继承`Person`,得到`name`和`sayHello()`。继承促进创新,子类可添加新方法如`study()`。但要注意继承的适用性和复杂度,以保持代码清晰和易维护。继承让Java编程既高效又灵活。
135 57
|
3月前
|
Java
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
37 0
Java 新手入门:重载和重写傻傻分不清?一篇文章带你清晰理解!
|
6月前
|
编译器 C语言 C++
【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数-1
【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数-1
|
6月前
|
存储 编译器 C语言
【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数-2
【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数-2
|
6月前
|
Java 编译器
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
【Java不看后悔系列】|面向对象编程|[继承、封装、多态全覆盖]
40 0
|
存储 安全 编译器
【巧妙继承】C++玩转继承的神级技巧
【巧妙继承】C++玩转继承的神级技巧
|
存储 安全 编译器
【C++精华铺】5.C++类和对象(中)类的六个默认成员函数
我们想到空类的时候肯定想到的是里面什么都没有的类称之为空类,但是事实却并非如此。当一个类里面什么都不写的时候编译器会默认生成六个默认成员函数来完成一个类的基本功能。构造函数:对象初始化工作。析构函数:空间清理工作。拷贝构造和赋值运算符重载:对象的拷贝复制工作。取地址和const取地址重载:一般很少自己实现,除非需要给用户返回指定的特殊的地址。
111 0
|
C++
第十三章 类继承
第十三章 类继承
105 0