• 面向对象特性之继承


    目录

    什么是继承?

    继承的访问特性

    子类构造方法

    super关键字

    继承方式

    final关键字

    组合



    什么是继承?

    通俗来讲,在Java中,如果一个或多个类实例化出的对象之间都存在共有的属性,那么就可以在一另一个类中去定义这些属性,之后每个对象需要用到这些属性时可以直接用,最终可以实现共性的抽取,代码的复用

    举个栗子:马和狗都是动物,都具有名字、年龄、吃饭、睡觉等共有属性,那么就可以将这些属性归纳在一起放入一个类当中,这个类就叫做父类(或基类、超类),而马或狗的类就叫做子类(或派生类)


    通过下面这段代码,我们先简单感受一下继承写法:

    1. class Animals{
    2. public String name;
    3. public int age;
    4. public void eat(){
    5. System.out.println("正在吃饭");
    6. }
    7. }
    8. class Horse extends Animals{
    9. public boolean Strong;
    10. public void run(){
    11. System.out.println("日行千里");
    12. }
    13. }
    14. class Dog extends Animals{
    15. public boolean silly;
    16. public void houseGuard(){
    17. System.out.println("看家护院");
    18. }
    19. }

     

     

     继承的访问特性

    子类通过对象访问父类成员:

    1.访问成员变量

    • 如果访问的成员变量子类中有,则访问子类自己的;
    • 如果访问的成员变量子类中没有,则访问从父类中继承下来的,如果父类中也没有,则编译错误;
    • 如果子类中存在与父类同名的成员变量,有限访问子类自己的。如果非要访问父类的变量,则需要借助关键字super.变量名引用;
    • 如果要访问的父类中私有的成员变量,可以借助Generate中的Getter方法;

    2.访问成员方法

    • 如果要访问子类和父类中不同名的方法,先在子类中找,找得到则访问子类的,找不到再去父类中找,找到了就访问父类继承下来的,否则编译错误;
    • 如果要访问子类和父类中同名的方法,如果是重载关系,会根据传入的参数选择对应的方法。如果完全一样(不是重载关系),会优先访问子类自己的该方法。
    • 如果非要访问父类中与子类同名的方法,则也只需要在子类中使用super.方法名即可

     当然子类也可以直接在子类内部调用父类成员



    子类构造方法

    我们知道类要实例化出对象需要传参,而子类的属性定义在父类中,要想给子类对象初始化改怎么做呢?

    其实正所谓子类继承父类,那当然就是先有父类才有子类。

    1.无参构造方法 

    这是我们自己不写构造方法时,可以直接给子类成员变量赋值,其实这种情况下,是编译器自动调用了子类和父类各自当中无参的构造方法。

     

    2.有参的构造方法

    首先:父类和子类都要有有参数的构造方法;

    其次:使用super(参数1,参数二)调用父类的构造方法,要求是这一句必须放在子类构造方法的第一句。

     子类也可以借助无参的调用有参的构造方法:

     

     注意:

     如果使用super在子类无参的构造方法中,就不能带第三个参数了,因为super是为父类成员初始化(不需要strong),而this是对当前对象初始化(需要strong)。同时要注意这两种写法不能同时出现在无参的构造方法中。

    super关键字

    在上面我们已经提到了super的使用——调用父类成员。

    super在继承中的作用:

    • 访问父类中与子类同名的成员变变量;
    • 访问父类中与子类同名的成员变方法;
    • 访问不同包的子类中被protected修饰的成员变量;
    • 参与子类构造方法中对父类构造方法的调用;
    • 只能在非静态方法中使用;

     

     

     继承方式

    分为三种:

     

    在多层继承中, 一般我们不要超过三层;

    final关键字

    有时候我们需要限制类的继承层数,就可以使用final;

    修饰类:表示该类为最终类,无法再被继承;

     

    修饰变量或字段:表示常量(即不能被修改)

     

    修饰方法:表示该方法不能再重写

     

    组合

    将一个类的实例作另为一个类的字段;

    通俗的讲:将一个事物分成多个部分,每个部分对应一种类,如果将每一种类实例化出来的对象放入另一个类中,就是一个组合。

    举个栗子:

    1. class Cpu{
    2. //...cpu类
    3. }
    4. class Graphics{
    5. //...显卡类
    6. }
    7. class Screen{
    8. //...显示器类
    9. }
    10. class Keyboard{
    11. //...输入类
    12. }
    13. class Computer{
    14. //电脑包含了以下这些字段
    15. private Cpu cpu;
    16. private Graphics graphics;
    17. private Screen screen;
    18. private Keyboard keyboard;
    19. }

  • 相关阅读:
    NFT: 开启加密艺术时代的无限可能
    心律守护 基于机器学习的心脏病预测
    了解GPT:ChatGPT的终极指南
    Rancher的主要功能有哪些?
    艾美捷测序级 II,纯化胰蛋白酶实验室使用的测定方法
    基于 Debian 稳定分支发行版的Zephix 7 发布
    msvcr120.dll丢失是什么意思,快速修复msvcr120.dll丢失的问题的方法分享
    电脑wifi丢失修复
    微信小程序页面传递参数方法
    java课程设计:基于SSM实现个人健康管理系统
  • 原文地址:https://blog.csdn.net/m0_65190367/article/details/126220581