多态与接口
多态
1.概念
多态:同一种事物在不同时刻表现不同的状态;
2.存在的必要条件
- 要有继承(包括接口的实现)(前提条件);
- 必须要有重写;
- 父类引用指向子类对象;
3.多态中成员的特点
1.多态成员变量:编译运行看左边
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
2.多态成员方法:编译看左边,运行看右边
Fu f1=new Zi();
System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
4.多态的转型
多态的转型分为向上转型和向下转型两种:
1.向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
Animal b = new Bird();//向上转型,子类自动上升为父类类型;
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
优点:父类引用表示子类对象,提升了代码的扩展性;
缺点:父类无法调用子类特有的方法;
2.向下转型(强制转化):一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
-
通过父类强制转换为子类,从而来调用子类 独有的方法
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
-
为了向下转型顺利完成, Java 中提供了一个关键字:
instanceof
(来判断某对象是否是某类的实例)(pan’duan)
A a = new B(); // 向上转型(B 是 A 的子类,C 是 B 的子类)
a instanceof A; // true
a instanceof B; // true
a instanceof C; // false
接口
1.概念:
接口:接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
- 接口和抽象类一样都是用于顶层类,规范特征方法;
- 成员变量默认为静态常量;
2.接口存在的意义
:一个类只能有一个(直接)父类,却可以实现多个接口;
3.接口中方法的定义:
public static.....//直接通过接口调用
public default.....//通过子类对象调用
接口是隐式抽象,声明时不需要abstract;
4.实例
接口的定义
package work2;
public interface A {
void fly();
}
定义父类
package work2;
public class Animal {
void eat(){
System.out.println("吃东西");
}
}
子类继承父类实现接口
package work2;
public class Test {
public static void main(String[] args) {
Animal b = new Bird();//向上转型
b.eat();
// b.fly();//报错,,因为向上转型丢失了与父类不同的子类fly方法
Bird c=(Bird)b;//向下转型
c.fly();
c.eat();
// Test test = new Test();
// test.myEatAndFly(b);
}
// public void myEatAndFly(Animal animal){
// if(animal instanceof Bird) {//判断
// Bird c = (Bird) animal;
// c.eat();
// c.fly();
// }
// }
}
5.接口的其他应用
package cn.com.Classwork190124;
/*
接口也经常用来被定义常量的集合 默认省略public static final
定义更简单,使用更方便
*/
public interface Person {
int num = 220;
double value = 50.0;
}
如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类。