🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
对象的转型 ~~~ package obj.b8; /** 对象的转型: 1.对象的向上转型 子类转成父类 默认进行 父类引用指向子类对象 2.对象的向下转型 父类转成子类 强制进行 关键字:instanceof 测试左边的对象是否是右边类的实例 ,如果是返回true,不是返回false */ class Animal{ void sleep(){ System.out.println("睡觉中"); } } class Cat extends Animal{ void catchMouse(){ System.out.println("捕鼠"); } } class Dog extends Animal{ } public class Test { public static void main(String[] args) { Animal a = new Cat();//向上 System.out.println(a instanceof Animal);//true System.out.println(a instanceof Cat);//true Cat c =(Cat)a;//向下 所以强制 a.sleep();//存在 //a.catchMouse();//不存在//将猫当动物看待 c.sleep();//存在 c.catchMouse();//存在 //Dog d =(Dog)a;//编译没错,但运行会出现类型不匹配错误 } } ~~~ 多态的概述 ~~~ package obj.b9; /* OOP三大特写:封装,继承,多态 多态:可以理解为事物存在的多种体现形态 动物:猫,狗,猪 人:男人 女人 */ class Animal{ void sing(){ System.out.println("唱歌"); } } class Dog extends Animal{ void sing(){ System.out.println("汪汪汪唱歌"); } } class Cat extends Animal{ void sing(){ System.out.println("喵喵喵唱歌"); } void catchMouse(){ System.out.println("捕鼠"); } } public class Test { public static void main(String[] args) { Cat a=new Cat(); Dog b=new Dog(); /*a.sing(); b.sing();*/ function(a); function(b); } /*public static void function(Cat c){ c.sing(); } public static void function(Dog c){ c.sing(); }*/ public static void function(Animal c){ c.sing(); } } ~~~ ~~~ 1.多态的体现 父类引用指向子类对象 2.多态的前提 (1)必须得类与类之间存在关系,可以是继承关系,也可以是实现关系 (2)必须得重写 3.多态的好处 大大提高了程序的可扩展性 4.多态的弊端 只能用父类的引用,访问到父类中的成员 多态成员变量的特点: 1.编译期间:参阅的是引用型变量所属的类中是否有调用的方法 2.运行期间:参阅对象所属的类中是否有调用的方法 ~~~ 对比: 没有多态 ~~~ package obj.c1; import java.util.*; class FK{ void bx(){ System.out.println("变形"); } } class FK_szx extends FK{//山字型 void bx(){ System.out.println("山字型在变形"); } } class FK_lzx extends FK{//L字型 void bx(){ System.out.println("L字型在变形"); } } class FK_zzx extends FK{//Z字型 void bx(){ System.out.println("Z字型在变形"); } } class FK_cfx extends FK{//长方形 void bx(){ System.out.println("长方形在变形"); } } public class Test { public static void main(String[] args) { Random r =new Random(); int a=r.nextInt(4);//0,1,2,3 switch(a){ case 0: FK_szx szx=new FK_szx(); szx.bx(); break; case 1: FK_lzx lzx=new FK_lzx(); lzx.bx(); break; case 2: FK_zzx zzx=new FK_zzx(); zzx.bx(); break; case 3: FK_cfx cfx=new FK_cfx(); cfx.bx(); break; } } } ~~~ 使用了多态 ~~~ package obj.c1; import java.util.*; class FK{ void bx(){ System.out.println("变形"); } } class FK_szx extends FK{//山字型 void bx(){ System.out.println("山字型在变形"); } } class FK_lzx extends FK{//L字型 void bx(){ System.out.println("L字型在变形"); } } class FK_zzx extends FK{//Z字型 void bx(){ System.out.println("Z字型在变形"); } } class FK_cfx extends FK{//长方形 void bx(){ System.out.println("长方形在变形"); } } public class Test { public static void main(String[] args) { Random r =new Random(); int a=r.nextInt(4);//0,1,2,3 FK fk=null; switch(a){ case 0: fk=new FK_szx(); break; case 1: fk=new FK_lzx(); break; case 2: fk=new FK_zzx(); break; case 3: fk=new FK_cfx(); break; } fk.bx(); } } ~~~