Java 多态


同一种事物由于条件不同,展示出不同的结果,叫做多态。

父类的引用类型,由于使用不同的子类对象实例,而执行不同的操作。

多态存在的三个必要条件

1. 子类继承父类;

2. 子类重写父类方法;

3. 父类引用指向子类对象。 //保证了同一个父类引用类型,使用不同的子类对象实例

比如:

People p=new Chinese();  p.say();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法

以下是多态实例演示:

 public class Test {
     public static void main(String[] args) {
         Person per=new Person();
         per.print( new B_And_W_Printer());//多态
         per.print( new ColorPrinter());//多态
     }
 
abstract class Printer { public abstract void print(); } class B_And_W_Printer extends Printer { //重写父类方法 public void print() { System.out.println("黑白打印机打印黑白内容"); } class ColorPrinter extends Printer { //重写父类方法 public void print() { System.out.println("彩色打印机打印彩色内容"); } } class Person { public void print(Printer p){ p.print(); } }

执行以上程序,输出结果为:

黑白打印机打印黑白内容
彩色打印机打印彩色内容

Java 父子类转型

⒈ 向上转型:子类转成父类,自动转换

 Person p= new Chinese();

特点:

  • 绝对安全(不会出错)。
  • 子类独有的属性和方法将会丢失,只能调用父类中存在的属性和方法。

如果父类方法不是抽象方法,那调用时,执行的方法体依旧是子类的。

  • 典型应用: 多态中父类引用指向子类对象

⒉ 向下转型: 父类转成子类,强制转换

Person() p=new Person();

Chinese c=(Chinese) p; //ClassCastException 类转换异常,因为p不是Chinese的实例化 对象,强转会造成类转换异常
Person() p=new English();

Chinese c=(Chinese) p; //ClassCastException 类转换异常,因为p不是Chinese的实例化对象,强转会造成类转换异常
Person() p=new Chinese();

Chinese c=(Chinese) p; /因为p是Chinese的实例化对象,可以强制转换

特点:不安全,会造成 ClassCastException 类转换异常,可使用instanceof提前判断

if (p instanceof Chinese){

   Chinese c=(Chinese) p ;

}

最新文章

  1. C#开发微信门户及应用(20)-微信企业号的菜单管理
  2. iOS ReactiveCocoa简单使用笔记
  3. 如何用github快速搭建个人博客
  4. jquery报错Uncaught ReferenceError: $ is not defined
  5. uber 真是垃圾
  6. 移动端前端常见的触摸相关事件touch、tap、swipe等整理
  7. ExtJs之DHTML,DOM,EXTJS的事件绑定区别
  8. 重拾C,一天一点点_4_随想
  9. 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)
  10. .NET 各种问题汇总
  11. Errors are values
  12. centos7忘记root密码
  13. Ubuntu18.04下给PyCharm创建快捷方式
  14. Base包equivalent
  15. 堆(heap)与栈(stack)
  16. Spark中的Phoenix Dynamic Columns
  17. IronPython初体验
  18. Spring学习14-源码下载地址
  19. 第一天:html+JavaScript函数
  20. 2019 wannafly winter camp

热门文章

  1. Promise,我们来实战
  2. Lintcode223 Palindrome Linked List solution 题解
  3. nicEditors使用方法
  4. 【Unity与23种设计模式】代理模式(Proxy)
  5. 学习python之路_入门篇A
  6. mysql备份并转移数据
  7. 安装Oracle11g的依赖包
  8. 为什么TCP的ISN是随机的?
  9. 【Python】 命名空间与LEGB规则
  10. 多线程&定时器Timer&同步&线程通信&ThreadLocal