Java-多态

tech2022-10-20  103

多态概述 : 多态的格式和使用:

/* 代码当中体现多态性,其实就是:父类引用指向子类对象。 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称(); */ public class Fu{ public void method(){ System.out.println("父类方法"); } public void methodFu(){ System.out.println("父类特有方法"); } } public class Zi extends Fu{ @override public void method(){ System.out.println("子类方法"); } } public class Demo01Multi{ public static void main(String[] args){ //使用多态的写法 //左侧父类的引用指向子类的对象 Fu obj = new Zi(); obj.method(); //new的是谁,调用谁 obj.methodFu(); //子类中没有,就往上找 } }

多态中成员变量的使用特点:

/* 访问成员变量的两种方式: 1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则想上找 2.间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找 */ public class Fu{ int num = 10; public void showNum(){ System.out.println(num); } } public class Zi extends Fu{ int num = 20; int age = 10; @override public void showNum(){ System.out.println(num); } } public class Demo01MultiField{ public static void main(String[] args){ //使用多态的写法,父类引用指向子类对象 Fu obj = new Zi(); System.out.println(obj.num); // 父类num :10 //System.out.println(obj.age); 错误写法 System.out.println("========"); //子类没有覆盖重写,就是父:10 //子类覆盖重写了,就是子:20 obj.showNum(); } }

多态中成员方法的使用特点:

/* 在多态的代码中,成员方法的访问规则是: 看new的是谁,就优先用谁,没有则向上找 口诀: 成员变量:编译看左边,运行还看左边 成员方法:编译看左边,运行看右边 */ public class Fu{ int num = 10; public void showNum(){ System.out.println(num); } public void method(){ System.out.println("父类方法"); } public void methodFu(){ System.out.println("父类特有方法"); } } public class Zi extends Fu{ int num = 20; int age = 10; @override public void showNum(){ System.out.println(num); } @override public void method(){ System.out.println("子类方法"); } public void methodZi(){ System.out.println("子类特有方法"); } } public class Demo02MultiMethod{ public static void main(String[] args){ Fu obj = new Zi(); // 多态 obj.method(); //父子都有,优先用子 obj.methodFu(); // 子类没有,父类有,向上找到父类 //编译看左边,左边是Fu,Fu中没有methodZi方法,所以编译报错。 //obj.methodZi(); 错误写法 } }

使用多态的好处: 对象的向上转型: 弊端:对象一旦向上转型为父类,那么就无法调用子类的特有方法 可以用对象的向下转型【还原】

对象的向下转型: 用instanceof关键字进行:

/* 如何才能知道一个父类引用的对象,本来是什么子类? 格式: 对象 instanceof 类名称 这将会得到一个boolean值结果,也就是判断前面的对象能不能当作后面类型的实例 */

练习:

/* 笔记本接口案例: */ public class Compouter { public void powerOn(){ System.out.println("笔记本电脑开机"); } public void powerOff(){ System.out.println("笔记本电脑关机"); } //使用Usb设备的方法,使用接口作为方法的参数 public void useDevice(USB usb){ usb.open(); //打开设备 if(usb instanceof Mouse){ //一定要先判断 Mouse mouse = (Mouse) usb; //向下转型 mouse.click(); }else if (usb instanceof Keyboard){ Keyboard keyboard = (Keyboard) usb; //向下转型 keyboard.type(); } usb.close(); //关闭设备 } } //鼠标就是一种USB设备 public class Mouse implements USB{ @Override public void open() { System.out.println("打开鼠标"); } @Override public void close() { System.out.println("关闭鼠标"); } public void click(){ System.out.println("鼠标点击"); } } public class Keyboard implements USB{ @Override public void open() { System.out.println("打开键盘"); } @Override public void close() { System.out.println("关闭键盘"); } public void type(){ System.out.println("键盘输入"); } } public interface USB { public abstract void open(); public abstract void close(); } public class DemoMain { public static void main(String[] args) { //首先创建一个笔记本电脑 Compouter compouter = new Compouter(); compouter.powerOn(); //准备一个鼠标供电脑使用 // Mouse mouse = new Mouse(); //首先进行向上转型 // USB usbMouse = mouse; USB usbMouse = new Mouse(); //多态写法 //参数是usb类型,我正好传递进去的就是usb鼠标 compouter.useDevice(usbMouse); //创建一个USB键盘 Keyboard keyboard = new Keyboard(); //没有使用多态写法 //方法参数是USB类型,传递进去的是实现类对象。 compouter.useDevice(keyboard); //正确写法,发生了向上转型 //compouter.useDevice(new Keyboard()); //也是正确,使用了匿名对象 compouter.powerOff(); } }

最新回复(0)