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项目控制台中文乱码
