🐳何为多态?
多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态。
比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的。
总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。
🐳如何实现多态?
在java中要实现多态,必须要满足如下几个条件,缺一不可:
1. 必须在继承体系下
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
这里以一个支付的结果来作为测试:
1. //提供一个抽象类或者接口 2. //这里提供一个抽象类 3. public abstract class Pay { 4. abstract String PayMethod(); 5. } 6. 7. public class PayPal extends Pay { 8. 9. @Override 10. public String PayMethod() { 11. System.out.println("支付宝Pay........"); 12. return "success"; 13. } 14. } 15. 16. public class UnionPay extends Pay { 17. @Override 18. public String PayMethod() { 19. System.out.println("银联Pay........"); 20. return "success"; 21. } 22. } 23. 24. public class WeChatPay extends Pay { 25. 26. @Override 27. public String PayMethod() { 28. System.out.println("微信Pay........"); 29. return "success"; 30. } 31. } 32. 33. public class Main { 34. public static void main(String[] args) { 35. //支付宝 36. Pay pay1=new PayPal(); 37. pay1.PayMethod(); 38. //银联 39. Pay pay2=new UnionPay(); 40. pay2.PayMethod(); 41. //微信 42. Pay pay3=new WeChatPay(); 43. pay3.PayMethod(); 44. } 45. 46. }
这就体现了多态。其中也包含了向上转型的方法。
🐳什么是向上转型?
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式:父类类型 对象名 = new 子类类型()
就比如上面的:
1. //支付宝 2. Pay pay1=new PayPal(); 3. pay1.PayMethod();
向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法。
有向上转型肯定会有向下转型啦!
🐳什么是向下转型?
向上转型会导致无法调用子类特有的方法,但是有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转换。
1. public abstract class Pay { 2. abstract String PayMethod(); 3. } 4. 5. public class PayPal extends Pay { 6. 7. @Override 8. public String PayMethod() { 9. System.out.println("支付宝Pay........"); 10. return "success"; 11. } 12. public void prompt(){ 13. System.out.println("余额不足,请选择其他方式进行支付"); 14. } 15. } 16. 17. public class Main { 18. public static void main(String[] args) { 19. //支付宝 20. Pay pay1=new PayPal(); 21. pay1.PayMethod(); 22. 23. //直接强转 24. pay1=(PayPal)pay1; 25. 26. ((PayPal) pay1).prompt(); 27. //利用instanceof 28. if(pay1 instanceof PayPal){ 29. pay1=(PayPal)pay1; 30. ((PayPal) pay1).prompt(); 31. 32. } 33. 34. 35. } 36. 37. }
注意:使用强转符 ()可能存在ClassCastException错误。
向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换。
🐳多态的优点:
可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
需要注意的是要避免在构造方法中调用重写的方法。
尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。
🐳什么是静态绑定与动态绑定?
静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表方法重载。
动态绑定:也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。