前言
在第七篇中,我们学习了继承的基础知识,相信大家对继承有一个初步的理解和认识,接下来的进阶篇,我们将学习继承在实际访问时的特点。最近又看到一句诗,分享给大家:“青山一道同云雨,明月何曾是两乡。”
一、继承中成员变量的访问特点
先把知识点告诉大家,后面会有实际代码应用方便大家理解:
①继承中成员变量的访问特点:就近原则,先在局部位置上找,再到本类位置中找,最后到父类位置中找,逐级递进。
②如果出现了重名的成员变量
System.out.println(name);//从局部位置往上找
System.out.println(this.name);//从子类成员位置往上找
System.out.println(super.name);//从父类成员位置往上找
场景应用:
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
d.show();
}
}
class Animal{
String name = "动物";
String hobby = "吃东西";
}
class Dog extends Animal{
String name = "小狗";
String color = "黑色";
public void show(){
//1.如何打印 小狗
System.out.println(name);
System.out.println(this.name);
//2.如何打印 动物
System.out.println(super.name);
//3.如何打印 吃东西
System.out.println(hobby);
System.out.println(this.hobby);
System.out.println(super.hobby);
//4.如何打印 黑色
System.out.println(color);
System.out.println(this.color);
}
}
运行结果:

二、继承中成员方法的访问特点
1.基本的成员方法继承
特点:
①就近原则,逐级递进。
②通过super关键字来访问父类的成员方法。
场景演示
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.lunch();
}
}
class Person{
public void eat(){
System.out.println("吃米饭,吃菜");
}
public void drink(){
System.out.println("喝热水");
}
}
class Student extends Person{
public void lunch(){
this.eat();
this.drink();
super.eat();
super.drink();
}
}
运行结果:

2.方法的重写
子类继承了父类的方法,但觉得父类的这个方法不符合自己的实际情况,于是,子类决定保留这个方法的名字,但重新编写它内部的实现逻辑。这就叫方法的重写(@Override)。
场景演示:
// 父类:老式手机
class Phone {
public void call() {
System.out.println("拨打电话…");
}
// 父类的显示来电方法
public void showCaller() {
System.out.println("显示来电号码:未知数字");
}
}
// 子类:智能手机
class SmartPhone extends Phone {
// 子类觉得父类的 showCaller 不够用,决定重写!
@Override
public void showCaller() {
// super.showCaller(); // 如果你想保留父类的原本功能,可以用 super 调用
System.out.println("显示来电号码");
System.out.println("显示联系人头像");
System.out.println("显示归属地:陕西西安"); // 纯属举例
}
}
// 测试类
public class OverrideDemo {
public static void main(String[] args) {
SmartPhone myPhone = new SmartPhone();
myPhone.call(); // 继承自父类的方法(子类没重写,直接用)
myPhone.showCaller(); // 调用的是子类重写后的方法!
}
}
运行结果:

方法重写的注意事项:
三、继承中构造方法的访问特点
特点:
- 父类中的构造方法不会被子类继承。
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。
- 如果想要方法中父类的有参构造,必须手动书写。
为什么?
- 子类在初始化时,可能会用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
- 子类在初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
如何调用父类构造方法的?
- 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行。
- 如果想调用父类有参构造,必须手动写super进行调用。
场景演示:
public class Test {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student("zhangsan", 23);
}
}
class Person{
String name;
int age;
public Person(){
System.out.println("父类的无参构造");
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
}
class Student extends Person{
public Student(){
super();
System.out.println("子类的无参构造");
}
public Student(String name, int age){
super(name, age);
}
}
运行结果:




