//判断指向的类型符合什么类型的时候
//判断的时候父类的对象必须写在子类的对象的下面
//使用的场景:子类的种类有限,当传的类型需要进行其他操作,需要调用特有方法时
if(a instanceof Cat) { Cat c = (Cat)a; c.catctMouse(); }
//类型提升 向上转型(转成父类型)
//将父类的引用转成子类的引用(向下转型)
//此操作不被允许,可以将父类的引用转为子类引用,不可以将父类的对象强转为子类的引用
//多态始终是子类对象的操作
Animal a=new Cat();//向上转型
Cat c=(Cat)a;//向下转型
在多态中,成员函数的特点(编译看左边,运行看右边)
(1)编译的时候看引用的类型中是否有调用的方法,如果有,编译通过,没有,失败
(2)在运行时,看对象的类中是否有调用的方法。
涉及到面试的环节()
在多态中,成元变量的特点:编译运行都看左边(引用)
public class test{ public static void main(String[] args) { fu f= new zi(); System.out.println(f.s); } } class fu{ String s="llll"; } class zi extends fu{ String s="aaa"; }
在多态中静态成员函数的特点,编译运行都看左边(父类运行父类,子类运行子类的)
public class test{ public static void main(String[] args) { fu f= new zi(); f.m4(); } } class fu{ static void m4(){ System.out.println("KKK"); } } class zi extends fu{ static void m4() { System.out.println("llll"); } }
多态主板实例(扩展槽的实现)
package test; //电脑运行依附于主板(主板运行了,电脑就运行了) interface PCI{ public void open(); public void end(); } public class test{ public static void main(String[] args) { diannao d=new diannao(); d.yunxing(); d.usePCI(new netCard()); } } class zhuban{ public void yunxing(){ System.out.println("主板运行"); } } class diannao{ zhuban z=new zhuban(); public void yunxing() { z.yunxing(); } public void useNetcard(netCard n) { n.start(); n.end(); } public void usePCI(PCI p) { p.open(); p.end(); } } class netCard implements PCI{ @Override public void open() { // TODO Auto-generated method stub System.out.println("网卡开启"); } @Override public void end() { // TODO Auto-generated method stub System.out.println("网卡关闭"); } }