1.抽象类
-
特点:抽象类和抽象类必须用abstract关键字修饰
abstract class 类名{}
public abstract void eat();注:抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类
-
抽象类的子类:要么是抽象类,要么重写抽象类的所有抽象方法
-
成员特点:
- 成员变量:既可以是变量,又可以是常量 ,abstract不能修饰成员变量
- 也有构造方法 ------>用于子类访问父类数据的初始化。
- 成员方法:既可以抽象的(强制要求子类做的事情),也可以是非抽象的(子类继承的事情,提高代码复用性)。
-
面试题1:
- 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以
这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
- 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
-
面试题2
- abstract不能和哪些关键字共存
- abstract static
- abstract final
二者均不可与abstract组合使用
2.接口类
- 概述:(有静态常量,没有静态变量)
- 狭义的角度就是指java中的interface
- 广义的角度指对外提供规则的都是接口
- 类实现接口
- 用implements表示 class 类名 implements 接口名{}
- 接口子类要重写接口中的所有抽象方法
- 接口子类既可以是抽象类,还可以是具体类
- 接口成员特点:
- 成员变量;只能是常量,并且是静态的并公共的。
默认修饰符:public static final
- 成员变量;只能是常量,并且是静态的并公共的。
- 类与类,类与接口,接口与接口的关系
- 类与类:只能单继承,可以多层继承
- 类与接口: 既可以单实现,还可以多实现; 还可以在继承类的同时实现多个接口
- 接口与接口:属于继承关系,单继承也可以多继承.
3.多态
- 概述:事物存在的多种形态
- 前提:
- 要有继承关系,
- 方法重写,
- 父类引用指向子类对象
- 非静态成员方法访问特点:
- 编译看左边(父类),运行看右边(子类)
- 在运行时,如果子类重写了父类的方法,则调用子类的,如果没有重写,则调用父类的
- 静态成员方法访问特点:(不存在重写)
- 编译看左边(父类),运行看左边(父类)。那一个类的引用调用就执行哪一个类的
- 成员变量访问特点:
- 编译看左边(父类),运行看右边(子类)
- 多态的向上转型和向下转型
- Person p = new SuperMan();向上转型
- SuperMan sm = (SuperMan)p;向下转型 // HtmlTeacher html =(HtmlTeacher) Teacher;<-----强转<------父类 父类=new 子类()调用子类特有的方法
- 多态的好处
- 提高了代码的维护性(继承保证)
- 提高了代码的扩展性(由多态保证)
- 多态的弊端
- 不能使用子类的特有属性和行为。
4.抽象类与接口的区别
- A:成员区别
- 抽象类:
- 成员变量:可以变量,也可以常量
- 构造方法:有
- 成员方法:可以抽象,也可以非抽象
- 接口:
- 成员变量:只可以常量
- 成员方法:只可以抽象(仅仅限于JDK1.8之前的版本)
- 抽象类:
- B:关系区别
- 类与类
- 继承,单继承
- 类与接口
- 实现,单实现,多实现
- 接口与接口
- 继承,单继承,多继承
- 类与类
- C:设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。