1.多态
1.1定义
是指一种行为,具有多种不同的表现形式
Java 父类 抽象方法 不同子类重写父类的方法是有不同的实现方式 。
1.2 多态的前提【重点】
a)继承或者实现
b)方法重写
c)父类引用指向子类的对象
父类类型 变量名=new 子类对象();
变量名.方法名()
Father父类 Son子类
Son son=new Son(); ->son间接调用Father成员
Father f=new Son(); 多态
f.method() ;-
当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译错误,执行的是子类重写的方法。
Animal ->Cat Dog
1.3 多态好处
可以使用程序编写更加简单,并有良好的可扩展性
1.3.1、向上转型:
a)多态本身是子类类型向父类类型向上转型的过程,当父类的引用指向一个子类实例时,便是向上转型,这个过程默认完成。自动转型。
1.父类类型 变量名=new 子类类型()
Animal a=new Cat(); ->
Cat自动转成了Animal,实现上a.eat()但是执行
时候子类负责实现方法a.eat()
面向对象最精彩:
编译期:JVM -》Animal 引用
运行期:JVM -》父类引用指向哪子类 -》调用子类方法()
编译期-》喝水 运行期 可乐,冰水, 咖啡。
Cat cat=new Cat Dog dog=new Dog() ->编译期Cat 或 Dog -》运行期-》eat()。
Sheep p=new Sheep(); ->Animal a=new Sheep(); a.eat()
可扩展 易于修改 。
向上转型要点:
1.自动转型,隐式转换,向上转型就是父类引用指向子类实例,也可以说,子类对象可以赋值给父类引用。
2.向上转型,是安全的,因为子类都要重写父类的方法,父类引用指向哪个子类,就调用子类重写父类的方法。
3.向上转型,父类只能调用子类重写的方法,不能调用子类特有的方法。
(非调用子类特有的方法,需要向下转型)
4.父类的静态方法是不允许子类重写。
1.4小结:
1.4.1 多态:
同一行为,不同表现形式
Java多态:
1)继承关系
2)子类重写父类的方法
3)父类引用指向子类实例
父类引用指向子类实例—》向上转型-》子类会自动转成父类
父类.方法—》子类重写的方法完成。
好处:
编译期 -》父类引用
运行期 -》父类引用指向哪个子类的实例 -》调用方法-》由哪个子类 负责实现。
1.4.2 动态绑定:
前提:向上转型
机制:能识别出对象转型前的类型,从而自动调用该子类方法
Animal.eat() ->Cat cat对eat()方法重写
Animal.eat() ->Dog catdog对eat()方法重写
绑定:就是将一个方法和所在类连接在一起,就叫绑定
Chinese c=new Chinese() c.speak();speak()->Chinese 连接在一起
分类:静态绑定和动态绑定
静态绑定:在程序编译期就知道方法和哪个对象连接在一起。(前期绑定)
动态绑定: 在程序运行期才能连接和类型绑定在一起,也就是说JVM
在运行期根据对象类型自动判断的连接哪个方法也叫后期绑定
1.4.3 向下转型:
a)父类转子类的过程,强制转换:
i.一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制转格式,就是向下转型。
ii.目的,父类能够调用子类特有的方法
2 接口
2.1概念:
是Java语言一种引用类型(数组、类与对象 接口、枚举)
如果说类内部封装了成员变量,构造方法,成员方法。
那么接口主要封装方法,方法集合。
a) 抽象方法 (抽象类可以有,可以没有 接口的方法必须是抽象)JDK1.7以前
b) 默认方法、静态方法(JDK1.8),私有方法(JDK1.9)
接口作用: 制定了标准或规范
2.2 接口定义:
interface 关键字 类 -》 .class,但是一定明确它并不是类,是一种引用的数据类型。【数组 类 接口枚举】
接口使用:接口的使用,它不以创建对象,但是可以被实现 (implements 类似于被继承)。一个接口实现类(可以看做接口子类),需要实现接口中所有抽象方法。创建该类对象,就可以调用方法了,如果你没有实现接口所有抽象方法,那么你肯定是抽象类。
接口语法格式:
Public interface 接口名称{
抽象方法
默认方法
静态方法
私有方法
}
接口实现类
Public class 类名 implements 接口{
必须要全部实现抽象方法
}
2.3 jdk 1.7接口新特性:
不光抽象方法
默认方法、静态方法 、私有方法
1.默认方法
default
interface A {
public default void methodA(){
}
Public default void methodB (){
}
}
Interface B {
public default void methodA(){
}
Public default void methodB (){
}
}
接口实现类:
Public class C implements A,B {
Public void method(){
System.out.println(“method”)
}
}
Public class c extends A,B
2.4 Java 在接口层面->多实现
一个类可以实现多个接口
设计类时候
一个类继承于一个父类,同时可以实现多个接口 (间接实现多继承)
静态方法:static void methodB(){}
其他成员:
1.接口中无法定义成员变量,int a=0, a 接口可以定义常量,其值必须赋值且是不可改
接口变量都是常量,用public static final修饰 ,名字需要大写
2.接口中:没有构造方法,不能创建对象
3.接口中:没有静态代码块
面试题:接口和抽象类区别
1.抽象类要被子类继承(extends),接口要被类实现(implements)
2.抽象类里面方法,可以只有定义(抽象方法),普通方法方法声明方法实现
接口中的所有方法,都只有方法的声明,没有方法实现
3.抽象类可以有变量、接口中定义变量只能公开不可修改的常量。
4.抽象类可以构造方法,接口没有构造方法
5.接口可以多实现,抽象类只能单继承
6.接口的抽象级别要比抽象类高。
7.接口是设计结果,抽象类是重构结果
共同点:向上转型 -》父类的引用指向子类对象
动态绑定-》通过引用调用子类重写的方法
多态 (接口必须多态)