继承和抽象

一、继承

1. 概述

前面提过Java中面向对象有三大特征:封装性、继承性、多态性。其中继承是多态的前提,没有继承就没有多态

  • 继承主要解决的问题是共性抽取
  • 继承描述的是事物之间的所属关系 。通过继承,可以使多种事物之间形成一种关系体系 。

2. 定义

  • 继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为 。在继承的关系中,子类可以被当作父类看待
    • 特点:
      • 子类可以拥有父类的内容
      • 子类还可以有自己专属的内容
    • 优点:
      • 提高代码的复用性
      • 类与类之间产生了关系,是多态的前提

3. 格式

  • 通过 extends 关键字,可以声明一个子类继承另外一个父类

    • class 父类{
      	...
      }
      
      class 子类 extends 父类{
      	...
      }
      

4. 继承后的特点——成员变量

父类中的成员变量是非私有的,子类中可以直接访问。若F父类中的成员变量私有了,子类是不能直接访问的。

通常编码时,我们遵循封装的原则,使用private修饰成员变量,若要访问父类的私有成员变量呢,可以在父类中提供公共的getXxx方法和setXxx方法

  • 成员变量不重名

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

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

    • 子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用 super 关键字修饰父类成员变量,类似于之前学过的this

    • 局部变量:		直接写成员变量名
      本类的成员变量:  this成员变量名
      父类的成员变量:  super成员变量名
      

一般有两种方式通过子类对象访问成员变量:直接或间接

  • 直接通过子类对象访问成员变量
    • 创建时等号左边是谁,就优先用谁,没有则向上找
  • 间接通过子类对象访问成员变量
    • 该方法属于谁在哪里定义的,就优先用谁,没有则向上找

5. 继承后的特点——成员方法

在父子类的继承关系中创建子类对象访问成员方法的规则是:创建的对象是谁,就优先用谁,没有则向上找。即子到父绝不会出现父到子。

  • 成员方法不重名

    • 如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
  • 成员方法重名——**重写(Override) **

如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写 (Override)

特点:创建的是子类对象,则优先用子类方法

注意事项:

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

②. 子类方法覆盖父类方法,函数名和参数列表都要一模一样。@Override写在方法前面可以检测是不是有效的正确覆盖重写

③. 子类方法覆盖父类方法,子类方法的返回值类型(如子String,父Object)必须小于等于父类方法的返回值范围

④. 子类方法覆盖父类方法,子类方法的权限必须小于等于父类方法的权限修饰【publlic>protected>(default)>private】。default不是关键字,而是什么都不写

  • 方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果。声明不变,重新实现。

  • 重写的应用:子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强

6. 继承后的特点——构造方法

  • 子类必须调用父类构造方法,不写则赠送super()。写了则用指定的Super调用。super只能有一个且必须是第一个
    • 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
    • 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
    • super的父类构造调用必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。this调用也必须是构造方法的第一个语句
    • this和super两种构造调用不能同时使用

7. super和this

super关键字用来访问父类内容,而this关键字用来访问本类内容

  • super关键字的三种用法
    • 在子类的成员方法中,访问父类的成员变量
    • 在子类的成员方法中,访问父类的成员方法
    • 在子类的构造方法中,访问父类的构造方法
  • this关键字的三种用法
    • 在本类的成员方法中,访问本类的成员变量
    • 在本类的成员方法中,访问本类的另一个成员方法
    • 在本类的构造方法中,访问本类的另一个构造方法

8. 继承的特点

  • . Java只支持单继承,不支持多继承。 一个类只能有一个父类,不可以有多个父类
  • Java支持多层继承(继承体系)
    • 顶层父类是Object类。所有的类默认继承Object,作为父类
  • 子类和父类是一种相对的概念

二、抽象类

1. 概述

父类中的方法被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。包含抽象方法的类就是抽象类

  • 定义
    • 抽象方法 : 没有方法体的方法 。父类当中的方法不确定如何进行{}的方法体实现,就是抽象方法
    • 抽象类:包含抽象方法的类

2. 抽象类的使用格式

①. 抽象方法

  • 使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体 ,就是没有大括号

  • 修饰符 abstract 返回值类型 方法名 (参数列表);
    

②. 抽象类

  • 如果一个类包含抽象方法,那么该类必须是抽象类

  • abstract class 类名字 {
    }
    

③. 举例

public abstract class Animal(){	//抽象类
    //抽象方法,代表吃东西,但具体内容不确定
    public abstract void eat();
    //普通成员方法
    public void normalMethod(){
        
    }
}

④. 抽象的使用

如何使用抽象类和抽象方法

  • 不能直接创建new抽象类对象
  • 必须用一个子类继承抽象父类
  • 子类必须覆盖重写抽象父类当中的所有抽象方法
    • 覆盖重写(实现):子类去掉抽象方法中的abstract关键字,然后补上方法体大括号
  • 创建子类对象进行使用

3. 抽象类的注意事项

  • 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象
    • 理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义
  • 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的
    • 子类的构造方法中,有默认的super(),需要访问父类构造方法
  • 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类
    • 未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设
  • 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象
    • 假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有
      意义
posted @ 2020-05-27 15:47  弥漫s  阅读(266)  评论(0)    收藏  举报