继承 抽象 接口 多态

1. 继承

  概述

    继承就是子类继承父类的属性和行为,子类可以直接访问父类的非私有方法

    Java语言是单继承 多级继承 一个父类可以有多个子类

    提高了代码的复用性,类与类之间产生了关系,是多态的前提

  继承中方法的覆盖重写(声明不变,重新实现)

    父子类之间方法,参数列表相同

    子类方法权限大于等于父类

    子类方法的返回值范围小于等于父类方法的返回值

    大部分情况下,方法子父类方法声明是完全一样的

  继承中构造方法的访问

    构造方法名与类名一致,所以子类无法继承父类构造

    构造方法用于初始化成员变量,子类的初始化过程中,须先执行父类的初始化动作

    父类成员变量初始化后,才可以给子类使用

    所以子类构造必须调用父类构造,不写则默认赠送super( ); 写了则不赠送

    子类构造可以通过super关键字调用父类重载构造

    子类构造中,super构造调用只能有一个且必须是第一个

    只有子类构造才能调用父类构造,子类成员方法不能调用父类构造

  继承中成员变量,成员方法的访问

    与多态完全一样

    成员变量:编译看左,运行看左

    成员方法:编译看左,运行看右

  super在继承中的用法  

    代表父类的存储空间标识(可以理解为父亲的引用)

    子类成员方法中访问父类的成员变量,方法

    子类构造访问父类构造 super( );

  this在继承中的用法

    代表当前对象的引用(谁调用就代表谁)

    本类成员方法中访问本类成员变量,成员方法

    本类构造访问本类另一构造

    this调用也必须是构造方法的第一个语句

      this和super两个构造调用不可同时使用

      this( ); 没有 .

  继承图解

    创建子类对象时,先初始化父类空间,再创建其子类对象本身

    先把父类构造执行完,再在这个父类内容的外围写上子类内容

2. 抽象

  概述

    子类们重写父类方法,而子类各自的实现都不尽相同

    则父类方法声明和方法主体,声明有意义,而方法主体没有意义

    没有方法主体的方法称为抽象方法,用abstract修饰

    包含抽象方法的类就是抽象类,用abstract修饰

  注意

    继承抽象类的子类须重写父类所有抽象方法,否则该子类也必须声明为抽象类

    抽象类不能创建对象,只能创建非抽象子类的对象

    抽象类有构造方法,供子类创建对象时,初始化父类空间使用

    不一定包含抽象方法,但是有抽象方法的类必定是抽象类

3. 接口

  概述

    接口是Java语言中一种引用类型,是方法的集合

    接口的作用是制定规则,实现扩展

    如果说类的内部封装了成员变量,构造方法和成员方法,那么接口的内部主要就是封装了方法

    接口定义用interface,也会被编译成.class文件,但要明确它不是类,而是引用数据类型

    接口不能创建对象,但可以被实现(implements,类似继承),接口实现类需实现接口所有方法

    类是单继承的,接口是可以多实现的(一个类实现多个接口)

    Java7抽象方法  /  Java8默认方法,静态方法  /  Java9私有方法(静态/默认)

  接口中的常量

    (public static final) 数据类型 变量名 = 值;

    接口常量必须赋值,否则无法通过编译

    命名规则:全大写 _连接 (NUM_OF_PEOPLE)

    通过 接口名.常量名 直接访问

    接口中的抽象方法:固定修饰符 public  abstract 可省略

  接口中的默认方法

    解决接口升级问题

    如果接口如添加新的抽象方法,则所有实现类都须实现此抽象方法

    若直接在接口中添加默认方法,则实现类代码不用更改

    可以直接通过接口名称.默认方法名称来调用接口的默认方法

    defaul关键字不能省略(因为接口中的方法默认是public的)

    接口默认方法可被继承,也可重写,但只能通过实现类对象调用

  接口中的静态方法

    静态与.class文件相关

    一个类可实现多个接口,它们的静态方法可能冲突

    所以应通过 接口名称.方法名( ) 调用静态方法,不能通过实现类对象调用

  接口中的私有方法

    解决接口中多个默认方法和静态方法之间的代码重复问题

    多个默认方法之间有重复的代码,用一个共有方法将其抽取出来

    但这个共有方法不能让实现类访问到,应该是私有化的,这就是私有方法

    普通私有方法:多个默认方法代码重复(修饰符只有private,加default报错,因为权限冲突)

    静态私有方法:多个静态方法代码重复(private和static顺序无所谓)

  注意事项

    1.接口没有静态代码块或者构造方法

    2.实现类所实现的多个接口存在重复的抽象方法,只需覆盖重写一次即可

    3.实现类所实现的多个接口存在重复的默认方法,则实现类必须对冲突的默认方法进行覆盖重写

    4.父类和接口的默认方法冲突,优先用父类的方法

    5.接口之间的多继承,多个父接口中的抽象方法重复,没关系

    6.多个父接口中的默认方法重复,子接口必须覆盖重写此默认方法,且带着default

4. 多态

  概述

    指同一行为,在不同对象身上的多种表现形式

    面向对象三大特征 : 封装 继承 多态

    多态的前提:1.继承/实现 2.方法的重写 3.父类引用指向子类对象

    格式:父类名称 对象名 =  new  子类名称( );

  多态的意义

    无论右边new的是哪个子类对象,左边都不变,代码统一

    实现父类的引用动态的调用子类的功能

    有良好的扩展性

    弊端是无法使用子类的特有内容

  多态成员变量,成员方法的访问

    与继承完全一样

    成员变量:编译看左,运行看左

    成员方法:编译看左,运行看右

  向上转型

    其实就是多态写法

    格式:父类名称 对象名 =  new 子类名称( );

    含义:创建一个子类对象,把它当作父类来看待使用

    向上转型一定是安全的,从小范围转向了大范围

    对象一旦向上转型为父类,则无法调用子类特有方法

    类似于基本类型的自动类型转换

  向下转型

    作用:解决多态的弊端 (无法使用子类的特有内容)

    格式:子类名称 对象名 = (子类名称) 父类对象;

    含义:将父类对象,还原成本来的子类对象

    向下转型须原路返回,否则编译通过,但运行报错

    类似于基本类型的强制类型转换

    向下转型之前用instanceof 判断一下

  Instanceof 方法

    对象名 instanceof 类名/数据类型 :返回一个boolean

原文地址:https://www.cnblogs.com/bushishucai/p/9631691.html