写点什么

Java 三大特性 (二)—继承

作者:共饮一杯无
  • 2022-10-17
    浙江
  • 本文字数:3465 字

    阅读完需:约 1 分钟

Java三大特性(二)—继承

概述

由来

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。如图所示:



其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。继承描述的是事物之间的所属关系,这种关系是: is-a 的关系。例如,图中兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。

定义

继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

好处

  1. 提高代码的复用性。

  2. 类与类之间产生了关系,是多态的前提。

继承的格式

通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:


class 父类 {...}class 子类 extends 父类 {...}
复制代码


继承演示,代码如下:


/** 定义员工类Employee,做为父类*/class Employee {    String name; // 定义name属性    // 定义员工的工作方法    public void work() {        System.out.println("尽心尽力地工作");    }}/** 定义讲师类Teacher 继承 员工类Employee*/class Teacher extends Employee {    // 定义一个打印name的方法    public void printName() {        System.out.println("name=" + name);    }}/** 定义测试类*/public class ExtendDemo01 {    public static void main(String[] args) {        // 创建一个讲师类对象        Teacher t = new Teacher();        // 为该员工类的name属性进行赋值        t.name = "小明";        // 调用该员工的printName()方法        t.printName(); // name = 小明        // 调用Teacher类继承来的work()方法        t.work(); // 尽心尽力地工作    }}
复制代码

继承后的特点—成员变量

当类之间产生了关系后,其中各类中的成员变量,又产生了哪些影响呢?

成员变量不重名

如果子类父类中出现不重名的成员变量,这时的访问是没有影响的。代码如下:


class Fu {    // Fu中的成员变量。    int num = 5;}class Zi extends Fu {    // Zi中的成员变量    int num2 = 6;    // Zi中的成员方法    public void show() {        // 访问父类中的num,        System.out.println("Fu num="+num); // 继承而来,所以直接访问。        // 访问子类中的num2        System.out.println("Zi num2="+num2);    }}class ExtendDemo02 {    public static void main(String[] args) {        // 创建子类对象        Zi z = new Zi();        // 调用子类中的show方法        z.show();    }}演示结果:Fu num = 5Zi num2 = 6
复制代码

成员变量重名

如果子类父类中出现重名的成员变量,这时的访问是有影响的。代码如下:


class Fu {    // Fu中的成员变量。    int num = 5;}class Zi extends Fu {    // Zi中的成员变量    int num = 6;    public void show() {        // 访问父类中的num        System.out.println("Fu num=" + num);        // 访问子类中的num        System.out.println("Zi num=" + num);    }}class ExtendsDemo03 {    public static void main(String[] args) {        // 创建子类对象        Zi z = new Zi();        // 调用子类中的show方法        z.show();    }}演示结果:Fu num = 6Zi num = 6
复制代码


子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用 super 关键字,修饰父类成员变量 。使用格式:


super.父类成员变量名


子类方法需要修改,代码如下:


class Zi extends Fu {    // Zi中的成员变量    int num = 6;    public void show() {        //访问父类中的num        System.out.println("Fu num=" + super.num);        //访问子类中的num        System.out.println("Zi num=" + this.num);    }}演示结果:Fu num = 5Zi num = 6
复制代码


小贴士:Fu 类中的成员变量是非私有的,子类中可以直接访问。若 Fu 类中的成员变量私有了,子类是不能直接访问的。通常编码时,我们遵循封装的原则,使用 private 修饰成员变量,那么如何访问父类的私有成员变量呢?对!可以在父类中提供公共的 getXxx 方法和 setXxx 方法。

继承后的特点—成员方法

当类之间产生了关系,其中各类中的成员方法,又产生了哪些影响呢?

成员方法不重名

如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。代码如下:


class Fu{    public void show(){        System.out.println("Fu类中的show方法执行");    }}class Zi extends Fu{    public void show2(){        System.out.println("Zi类中的show2方法执行");    }}public class ExtendsDemo04{    public static void main(String[] args) {        Zi z = new Zi();        //子类中没有show方法,但是可以找到父类方法去执行        z.show();        z.show2();    }}
复制代码

成员方法重名—重写(Override)

如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写 (Override)。方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。代码如下:


class Fu {    public void show() {        System.out.println("Fu show");    }}class Zi extends Fu {    //子类重写了父类的show方法    public void show() {        System.out.println("Zi show");    }}public class ExtendsDemo05{    public static void main(String[] args) {        Zi z = new Zi();        // 子类中有show方法,只执行重写后的show方法        z.show(); // Zi show    }}
复制代码

重写的应用

子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。比如新的手机增加来电显示头像的功能,代码如下:


class Phone {    public void sendMessage(){        System.out.println("发短信");    }    public void call(){        System.out.println("打电话");    }    public void showNum(){        System.out.println("来电显示号码");    }}
复制代码


//智能手机类class NewPhone extends Phone {    //重写父类的来电显示号码功能,并增加自己的显示姓名和图片功能    public void showNum(){        //调用父类已经存在的功能使用super        super.showNum();        //增加自己特有显示姓名和图片功能        System.out.println("显示来电姓名");        System.out.println("显示头像");    }}    public class ExtendsDemo06 {    public static void main(String[] args) {    // 创建子类对象    NewPhone np = new NewPhone();    // 调用父类继承而来的方法    np.call();    // 调用子类重写的方法    np.showNum();    }}
复制代码


小贴士:这里重写时,用到 super.父类成员方法,表示调用父类的成员方法。

注意事项

  1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

  2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

继承后的特点—构造方法

当类之间产生了关系,其中各类中的构造方法,又产生了哪些影响呢?首先我们要回忆两个事情,构造方法的定义格式和作用。


  1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。

  2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构


造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。代码如下:


class Fu {    private int n;    Fu(){        System.out.println("Fu()");    }}
class Zi extends Fu { Zi(){ // super(),调用父类构造方法 super(); System.out.println("Zi()"); }}public class ExtendsDemo07{ public static void main (String args[]){ Zi zi = new Zi(); }}输出结果:Fu()Zi()
复制代码

本文内容到此结束了,

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力

如有错误❌疑问💬欢迎各位指出。

主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

发布于: 刚刚阅读数: 3
用户头像

鲜衣怒马意气风发,愿你归来仍是少年。 2018-10-19 加入

全栈开发者,CSDN博客专家,51CTO 专家博主,阿里云专家博主,华为云享专家,持续输出干货,欢迎关注。

评论

发布
暂无评论
Java三大特性(二)—继承_Java_共饮一杯无_InfoQ写作社区