一、概念
多态:父类引用指向子类对象
前提:必须有子类关系或者类实现对象接口关系
使用:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
二、继承VS实现
继承:子类继承父类可以被继承的内容,是this is的关系
实现:实现类实现接口中的抽象方法,是额外功能,是like is的关系
三、定义格式
1.普通继承
父类:
public class Fu(){}
子类:
public class Zi extends Fu(){}
测试类:
public class Test {
public static void main(String[] args) {
Fu f=new Zi();
}
}
2.抽象类继承
抽象父类:
public abstract class Fu {
//定义抽象方法
public abstract void eat();
}
子类重写父类方法:
public class Zi extends Fu {
//子类重写父类方法
public void eat(){
System.out.println("子类爱吃饭");
}
}
3.接口实现
接口:
public interface Fu {
//定义抽象方法,可省略public abstract
public abstract void eat();
}
实现类:
public class Zi implements Fu {
//实现类重写接口中抽象方法
public void eat(){
System.out.println("子类爱吃饭");
}
}
四、向上、下转型
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
向上转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用。
public class Test01 {
public static void main(String[] args) {
//猫的向上转型
Animal c=new Cat();
//调用猫和动物的共有方法
c.eat();
//猫的向下转型,判断c是否属于Cat类
if(c instanceof Cat){
Cat c1=(Cat)c;
//调用猫的特有方法
c1.catchMouse();
}
}
}
instanceof:判断是否对象属于子类
变换一:多态调用中方法时传参
题目:在电脑的USB接口可以连接键盘、鼠标
分析:键盘和鼠标都有USB插口,它们的子类作为参数传入到电脑的使用USB接口便可实现对应方法,在测试类中使用多态使得只要是继承了USB接口的事物都可以完成同样的方法。
测试类:
public class Test07 {
public static void main(String[] args) {
//向上转型,成员方法运行看子类,所以调用鼠标里的方法,同时也是USB中的虚方法
USB m=new MouseUSB();
Computer c=new Computer();
c.useUSB(m);
}
}
电脑类:
public class Computer {
//使用USB接口,传入USB,调用接口实现类中的功能
public void useUSB(USB u){
u.open();
u.close();
}
}
USB父类:
public interface USB {
//定义开关的虚方法
public abstract void open();
public abstract void close();
}
鼠标USU子类:
public class MouseUSB implements USB {
//重写类中的方法
public void open() {
System.out.println("鼠标打开");
}
public void close() {
// TODO Auto-generated method stub
System.out.println("鼠标关闭");
}
}
五、多态优缺点
优点:当父类的引用指向子类对象时,隐藏了子类类型,提高了代码的扩展性。
小结:
多态其实就是子类继承父类之后要实现父类中的功能,这样就可以扩展子类的使用,正如上个例子中,电脑中USB功能的实现,可以传入键盘和鼠标这样就可以使得代码的复用性增强。