多态的概述
多态的格式与使用
package com.Demo11;/*代码当中体现多态性,其实就一句话,父类引用指向子类对象格式:父类名称 对象名 = new 子类名称();或者:接口名称 对象名 = new 实现类名称(); */public class DemoMain { public static void main(String[] args) { //使用态的写法 //左侧父类的引用,指向了右侧子类的对象 Fu obj = new Zi(); obj.method(); obj.methodFu(); }}========================================================================================================================================package com.Demo11;public class Fu { public void method(){ System.out.println("父类共有方法"); } public void methodFu(){ System.out.println("父类独有方法"); }}========================================================================================================================================package com.Demo11;public class Zi extends Fu{ public void method(){ System.out.println("子类的共有方法"); } public void methodZi(){ System.out.println("子类独有方法"); }}
多态中成员变量的使用特点
package com.Demo11;/*访问成员变量的两种方式:1.直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找2.间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则向上找 */public class DemoMain { public static void main(String[] args) { //使用多态的写法,杜磊引用指向子类的对象 Fu obj = new Zi(); System.out.println(obj.num); //父 10// System.out.println(obj.age); //错误写法 obj.showNum(); //子类没有覆盖重写 10 }}========================================================================================================================================package com.Demo11;public class Fu { int num = 10; public void method(){ System.out.println("父类共有方法"); } public void methodFu(){ System.out.println("父类独有方法"); } public void showNum(){ System.out.println(num); }}========================================================================================================================================package com.Demo11;public class Zi extends Fu{ int num = 20; int age=30; public void method(){ System.out.println("子类的共有方法"); } public void methodZi(){ System.out.println("子类独有方法"); }}
多态中成员方法的使用特点
package com.Demo11;/*在多态的代码当中,成员方法的访问规则是: 看new的是谁,就看用谁,没有则向上找口诀:编译看左边,运行看右边对比一下:成员变量:编译看左边,运行还看左边成员方法:编译看左边,运行看右边 */public class DemoMain { public static void main(String[] args) { Fu obj = new Zi(); obj.method(); //父子都有,优先用子 obj.methodFu(); //子类没有,父类有,向上找到父类 }}========================================================================================================================================package com.Demo11;public class Fu { int num = 10; public void method(){ System.out.println("父类共有方法"); } public void methodFu(){ System.out.println("父类独有方法"); } public void showNum(){ System.out.println(num); }}========================================================================================================================================package com.Demo11;public class Zi extends Fu{ int num = 20; int age=30; public void method(){ System.out.println("子类的共有方法"); } public void methodZi(){ System.out.println("子类独有方法"); }}
使用多态的好处
对象的向上转型

package com.Demo11;public class DemoMain { public static void main(String[] args) { //向上的转型就是fui引用指向子类对象 Animal obj = new Cat(); obj.eat(); }}========================================================================================================================================package com.Demo11;public abstract class Animal { public abstract void eat();}========================================================================================================================================package com.Demo11;public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); }}
对象的向下转型

package com.Demo11;public class DemoMain { public static void main(String[] args) { //向上的转型就是父类引用指向子类对象 Animal obj = new Cat(); obj.eat(); //向下转型,进行“还原”动作 Cat cat = (Cat) obj; cat.catchMouse(); //下面是错误的向下转型 //本来new的时候是一只猫,现在非要当做狗 //错误写法!编译不会报错,但是运行会报错 //java.lang.ClassCastException Dog dog = (Dog) obj; }}========================================================================================================================================package com.Demo11;public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫抓老鼠"); }}========================================================================================================================================package com.Demo11;public class Dog extends Animal{ @Override public void eat() { System.out.println("狗吃骨头"); }}========================================================================================================================================package com.Demo11;public abstract class Animal { public abstract void eat();}
用instanceof关键字进行判断
package com.Demo11;/*如何才能知道一个父类引用的对象,本来是什么子类?格式:对象 instanceof 类名称这将会得到一个boolean值结果,也就是判断前面的对象你们那当后面类型的实例 */public class DemoMain { public static void main(String[] args) { //向上的转型就是fui引用指向子类对象 Animal obj = new Cat(); obj.eat(); //猫吃鱼 //如果希望调用子类特有方法,需要向下转型 //判断一下父类引用obj本来是不是Dog if (obj instanceof Dog){ Dog dog = (Dog) obj; dog.watchHouse(); } //判断一下父类引用obj本来是不是Cat if(obj instanceof Cat){ Cat cat = (Cat) obj; cat.catchMouse(); } }}========================================================================================================================================package com.Demo11;public class Dog extends Animal{ @Override public void eat() { System.out.println("狗吃骨头"); } public void watchHouse(){ System.out.println("狗看门"); }}========================================================================================================================================package com.Demo11;public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫抓老鼠"); }}========================================================================================================================================package com.Demo11;public abstract class Animal { public abstract void eat();}
接口多态的综合案例-笔记本USB接口


package com.Demo12;public interface UsbInterface { public abstract void open(); //打开设备 public abstract void close(); //关闭设备}========================================================================================================================================package com.Demo12;public class Computer { public void powerOn(){ System.out.println("电脑开机"); } public void powerOff(){ System.out.println("电脑关机"); } //使用USB接口的方法,使用接口作为方法的参数 public void useDevice(UsbInterface usb){ usb.open(); //打开设备 if(usb instanceof Mouse){ //一定要先判断 Mouse mouse = (Mouse) usb; //向下转型 mouse.click(); }else if(usb instanceof KeyBoard){ //先判断 KeyBoard keyboard =(KeyBoard) usb; keyboard.input(); } usb.close(); //关闭设备 }}========================================================================================================================================package com.Demo12;public class Mouse implements UsbInterface{ @Override public void open() { System.out.println("打开鼠标"); } @Override public void close() { System.out.println("关闭鼠标"); } public void click(){ System.out.println("鼠标点击"); }}========================================================================================================================================package com.Demo12;public class KeyBoard implements UsbInterface{ @Override public void open() { System.out.println("打开键盘"); } @Override public void close() { System.out.println("关闭键盘"); } public void input(){ System.out.println("键盘输入"); }}========================================================================================================================================package com.Demo12;public class DemoMain { public static void main(String[] args) { //首先创建一个电脑类 Computer computer = new Computer(); computer.powerOn(); //首先向上转型 UsbInterface mouse = new Mouse(); //参数是USB类型,我正好传递进去的就是USB鼠标 computer.useDevice(mouse); //创建一个USB键盘 KeyBoard keyboard = new KeyBoard(); //没有使用多态写法 //参数是USB类型,我正好传递进去的是实现类对象 computer.useDevice(keyboard); //正确写法!也发生了向上转型 //使用子类对象,匿名对象,也可以// computer.useDevice(new KeyBoard()); //也是正确写法 computer.powerOff(); }}