zoukankan      html  css  js  c++  java
  • javaSE_11_继承初识

    知识框架

    继承概述

    继承是面向对象三大特征之一,封装居首位,封装之后形成了独立体,独立体 A和独立体B 之间可能存在继承关系。其实程序中的继承灵感来自于现实生活,在现实生活中继承处处可见,例如,儿子继承了父亲的财产,儿子不需要努力就很有钱。

    生活中的继承:

    继承时子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性,或子类从父类继承方法,使得子类具有与父类相同的行为。兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。所以继承需要符合的关系是:is-a(Bird is-aAnimal),父类更通用,子类更具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

    定义

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

    如何继承

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

    代码示例:

    复制代码; "复制代码")

    package com.wrg; // 定义员工类Employee,做为父类
    class Employee { // 定义name属性
    String name; // 定义员工的工作方法

    public void work() {
        System.out.println("尽心尽力地工作");
    }

    } /** * 定义讲师类Teacher 继承 员工类Employee */
    class Teacher extends Employee { // 定义一个打印name的方法

    public void printName() {
        System.out.println("name=" + name);
    }

    } //定义测试类

    public class ExtendsTest { public static void main(String[] args) { // 创建一个子类对象

        Teacher t = new Teacher(); // 为该员工类的name属性进行赋值
        t.name = "小明"; // 调用该员工的 // printName()方法
        t.printName(); // name = 小明 // 调用Teacher类继承来的work()方法
        t.work(); // 尽心尽力地工作

    }
    }

    复制代码; "复制代码")

    好处

    • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
    • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
    • 继承的出现让类与类之间产生了关系,提供了多态的前提。
    • 继承的作用中除了可以让代码复用之外,还有非常重要的两个作用,那就是有了继承之后才会衍生出方法的覆盖和多态机制。

    注意:不要仅为了获取其他类中某个功能而去继承

    子类的特点

    • 子类继承了父类,就继承了父类的方法和属性。
    • 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
    • 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。

    继承的规则:

    B类继承 A类,则称 A类为超类(superclass)、父类、基类,B类则称为子类(subclass)、派生类、扩展类。

    子类不能直接访问父类中私有的(private)的成员变量和方法。

    Java只支持单继承和多层继承,不允许多重继承

    • 一个子类只能有一个父类
    • 一个父类可以派生出多个子类

    class SubDemo extends Demo{ } //ok
    class SubDemo extends Demo1,Demo2...//error

                        

    java 中规定,子类继承父类,除构造方法不能继承之外,剩下都可以继承。但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。可以通过间接的手段来访问。)

    java 中的类没有显示的继承任何类,则默认继承 Object类,Object类是 java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 Object类型中所有的特征。

    继承的弊端

    • 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性

    继承的应用场景

    • 使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承。is..a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类

    继承中成员方法的访问特点

    本质上,子类继承父类之后,是将父类继承过来的方法归为自己所有。实际上调用的也不是父类的方法,是他子类自己的方法(因为已经继承过来了就属于自己的)。

    通过子类对象访问一个方法

    1. 先去子类成员范围找
    2. 在去父类成员范围找
    3. 如果都没有就报错(不考虑父亲的父亲…)

    继承中变量的访问特点

    在子类方法中访问一个变量,采用的是就近原则。

    1. 先去子类局部范围找
    2. 在去子类成员范围找
    3. 之后去父类成员范围找
    4. 如果都没有就报错(不考虑父亲的父亲…)

    继承中构造方法的访问特点

    • 子类中所有的构造方法默认都会访问父类中无参的构造方法
    • ​子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
    • 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
    • 对象在堆内存中,会单独存在一块super区域,用来存放父类的数据

    问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

    • 通过使用super关键字去显示的调用父类的带参构造方法
    • 在父类中自己提供一个无参构造方法

    总结一下

    this丶super关键字:

    • this:代表本类对象的引用
    • super:代表父类存储空间的标识(可以理解为父类对象引用)

    三种用法

          

    this和super的区别

           

  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309065.html
Copyright © 2011-2022 走看看