Java中面向对象三大特性之一:多态(Generics)
零、什么是多态?
多态是同一个行为具有多个不同表现形式或形态的能力。也可以理解为,同一个事件作用在不同对象上会产生不同的结果。
一、现实实例
-
如图:
二、多态存在的三个前提条件
子类和父类之间要有继承关系。 子类要重写父类方法。 父类的引用要指向子类实例化的对象,对象调用方法时会调用子类实现的方法,而不是父类的实现方法,这就是多态。(比如,Human c=new Chinese();语句在堆内存中开辟的了子类Chinese的对象 ,并把栈内存中的父类Human的引用指向了子类对象)
三、代码演示
package com.znzz.java.test; public class GenericsDemo { public static void main(String[] args) { // TODO Auto-generated method stub Chinese c=new Chinese(); test(c); American a=new American(); test(a); System.out.println("================="); Human hc=new Chinese();//向上转型 hc.speak();//对象调用被子类Chinese重写的方法 hc.read();//对象调用父类本身的方法 System.out.println("================="); Human ha=new American();//向上转型 ha.speak(); System.out.println("================="); Chinese c1=(Chinese)hc;//向下转型 c1.speak(); c1.skin(); } //用static修饰方法,使其成为静态方法,类加载之后便可以直接调用此方法,而不需要类的实例 public static void test(Human human) { human.speak(); human.read(); System.out.println("-----------"); //判断左边的对象是不是右边类的实例 if(human instanceof Chinese) { Chinese ch=(Chinese)human;//如果human是子类Chinese的实例,则把该实例强制类型转化为该子类的对象 ch.speak(); ch.skin(); System.out.println("-----------"); }else if(human instanceof American){ American am=(American)human; am.speak(); am.skin(); } } } //定义抽象类 abstract class Human{ abstract void speak();//声明抽象方法 //也可以声明普通的方法,如下 void read() { System.out.println("人类是会阅读的");//普通方法是不用被子类重写的 } } class Chinese extends Human{ //继承抽象类必须重写抽象类中的方法 @Override void speak() { // TODO Auto-generated method stub System.out.println("中国人是说汉语的"); } //子类声明自己的方法 void skin() { System.out.println("中国人的肤色整体偏黄"); } } class American extends Human{ //继承抽象类必须重写抽象类中的方法 @Override void speak() { // TODO Auto-generated method stub System.out.println("美国人是说英语的"); } void skin() { System.out.println("美国人的肤色整体偏白"); } }
运行结果如下: 中国人是说汉语的 人类是会阅读的 ----------- 中国人是说汉语的 中国人的肤色整体偏黄 ----------- 美国人是说英语的 人类是会阅读的 ----------- 美国人是说英语的 美国人的肤色整体偏白 ================= 中国人是说汉语的 ================= 美国人是说英语的 ================= 中国人是说汉语的 中国人的肤色整体偏黄
以下是编写时出现的错误,做一下记录:具体原因看报错
上一篇:
IDEA上Java项目控制台中文乱码