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的区别

           

  • 相关阅读:
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    第08组 Beta冲刺(4/5)
    第08组 Beta冲刺(3/5)
    第08组 Beta冲刺(2/5)
    第08组 Beta冲刺(1/5)
    第08组 Alpha事后诸葛亮
    第08组 Alpha冲刺(6/6)
    第08组 Alpha冲刺(5/6)
    第08组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/wurengen/p/13255834.html
Copyright © 2011-2022 走看看