欢迎光临
我们一直在努力

【从零开始学Java | 第八篇】继承进阶

前言

        在第七篇中,我们学习了继承的基础知识,相信大家对继承有一个初步的理解和认识,接下来的进阶篇,我们将学习继承在实际访问时的特点。最近又看到一句诗,分享给大家:“青山一道同云雨,明月何曾是两乡。

一、继承中成员变量的访问特点

        先把知识点告诉大家,后面会有实际代码应用方便大家理解:

        ①继承中成员变量的访问特点:就近原则,先在局部位置上找,再到本类位置中找,最后到父类位置中找,逐级递进

        ②如果出现了重名的成员变量

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(); // 调用的是子类重写后的方法!
}
}

运行结果:

方法重写的注意事项:

  • 重写方法的名称、形参列表必须与父类中的一致。
  • 子类方法的权限修饰符,必须大于或等于父类。
  • 子类方法的返回值类型,必须小于或等于父类。
  • 建议重写的方法尽量和父类保持一致。
  • 只有被添加到虚方法表中的方法才能被重写。
  • 在重写的方法上面,强烈建议加上 @Override
  • 三、继承中构造方法的访问特点

    特点:

    • 父类中的构造方法不会被子类继承。
    • 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。
    • 如果想要方法中父类的有参构造,必须手动书写。

    为什么?

    • 子类在初始化时,可能会用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
    • 子类在初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。

    如何调用父类构造方法的?

    • 子类构造方法的第一行语句默认都是: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);
    }
    }

    运行结果:

    赞(0)
    未经允许不得转载:171主机测评 » 【从零开始学Java | 第八篇】继承进阶
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址