package cn.java; /** * 对象的多态性 * 父类型指向子类对象 * 简单说,就是一个对象对应着不同类型,多态在代码中的体现, * 父类或者接口的引用指向其子类的对象。 * * 多态的好处: * 提高了代码的扩展性,前期定义的代码可以使用后期的内容。 * 多态弊端: * 前期定义内容不能调用后期子类特有内容 * 多态的前提: * 1、必须由关系,继承或者实现。 * 2、要有覆盖 * */ abstract class Animal{ abstract void eat(); } class Dog extends Animal{ void eat(){ System.out.println("啃骨头"); } void lookHome(){ System.out.println("看家"); } } class Cat extends Animal{ void eat(){ System.out.println("吃鱼"); } void play(){ System.out.println("抓老鼠"); } } public class Javaduotai { public static void main(String[] args) { // Cat c=new Cat(); // c.play(); // method(c); // Dog D=new Dog(); // method(D); Animal animal=new Cat();//自动类型提升,猫对象提升为动物类型。不能叫小动物去抓老鼠,所以不能使用猫的特有方法; animal.eat();//作用就是限制对特有功能的访问。 //如果想用猫内特有方法,可以将该对象进行向下转型。 Cat c1=(Cat)animal;//向下转型,是为了使用子类的特有方法 c1.play(); /**注意:对于转型,自始至终都是子类对象在做着类型的变化。不能new Dog() 然后转成Cat*/ method(new Dog()); } public static void method(Animal A){//多态Anima A=c或者D A.eat(); if(A instanceof Cat)//instanceof,用于判断对象的具体类型,只能用于引用数据类型的判断。 //通常在向下转型前用于健壮性判断; { Cat cat=(Cat)A; cat.play(); }else if(A instanceof Dog) { Dog dog=(Dog)A; dog.lookHome(); } } }
package cn.java; /**多态时: * 1、成员变量特点 * 编译时:参考引用型变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败。 * 运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员 * 单间说:编译时和运行时参考等号的左边,哦了。 * 2、成员函数特点 * 编译时:参考引用型变量所属的类中是否有调用的函数,有,编译成功,没有编译失败。简单说就是看父类中是否有想对应方法或者属性,有就编译成功,没有编译失败 * 运行时:参考对象所属的类中是否有调用的函数。 * 简单说:编译看左边,运行看右边 * 3、静态函数的特点 * 编译时:参考引用类型变量所属的方法中是否存在调用的静态方法 * 运行时:参考引用类型变量所属的方法中是否存在调用的静态方法 * 简单说:都看右边*/ class F1{ int num=3; void show(){ System.out.println("f show"); } static void tell(){ System.out.println("a"); } } class Z1 extends F1{ int num=4; void show(){ System.out.println("Z show"); } static void tell(){ System.out.println("b"); } } public class Javaduotai2 { public static void main(String[] args) { F1 f1=new Z1(); System.out.println(f1.num);//3 f1.show(); f1.tell();//静态函数不涉及多态 原因是可以直接使用类名调用F1.tell();z1.tell(); // TODO Auto-generated method stub } }
package cn.java; /** * 定义USB接口规则,从而降低笔记本与外设设备的耦合性,同时实现功能扩展*/ interface USB{ public void open(); public void close(); } class Mouse implements USB{ public void open(){ System.out.println("鼠标连接成功"); } public void close(){ System.out.println("鼠标拔出"); } } class Upan implements USB{ public void open(){ System.out.println("Upan连接成功"); } public void close(){ System.out.println("Upan拔出"); } } public class JavaInterface { public static void main(String[] args) { useUSB(new Upan()); useUSB(new Mouse()); } public static void useUSB(USB u){ if(u!=null){ u.open(); u.close();} } }