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值