1、多态性,可以理解为一个事物的多种表现形态
1> 方法的多态性:重载与重写
2>子类对象的多态性:父子类对象的转换
①、父类的引用指向子类对象(即向上转型),当调用方法时,实际上执行的是子类重写父类已有的方法。
格式:父类 父类对象 = 子类实例
class Man extends Person{
Person p1 = new Man();
p1.eat();
p1.walk();
}
②、子类的引用指向父类对象(即向下转型),使用强转符(),父类对象变为子类对象。
(作用:子类扩展了父类的属性和方法,弥补向上转型时,子类特有属性、方法丢失的问题)
格式:子类 子类对象 = (子类)父类实例;
class Man extends Person{
Person p1 = new Man();
Man m = (Man)p1;
m.smoking();
}
2、子类对象的多态性使用的前提:①要有类的继承②要有子类对父类方法的覆写。
3、程序运行分为编译和运行状态。
对于多态性来说,编译时,“看左面”,将此引用变量理解为父类的类型
运行时,“看右面”,关注真正对象的实体:子类的对象。
4、子类对象的多态性,并不适用于属性。
多态具体使用如下实例所示:
package com.hdu.java;
public class TestPeople {
public static void main(String[] args) {
TestPeople tp = new TestPeople();
tp.fun(new People());
tp.fun(new Man());
tp.fun(new Woman());
}
public void fun(People p) {
p.eat();
p.sleep();
if(p instanceof Man) {
Man m = (Man)p;
m.smoking();
}else if(p instanceof Woman) {
Woman w = (Woman)p;
w.shopping();
}
}
}
class People{
public void sleep() {
System.out.println("人睡觉");
}
public void eat() {
System.out.println("人吃饭");
}
}
class Man extends People{
public void sleep() {
System.out.println("男人粗鲁地睡觉");
}
public void eat() {
System.out.println("男人大口吃饭");
}
public void smoking() {
System.out.println("男人怎能不抽烟!");
}
}
class Woman extends People{
public void sleep() {
System.out.println("女人孤独地睡觉");
}
public void eat() {
System.out.println("女人小心翼翼地吃饭");
}
public void shopping() {
System.out.println("女人如何不购物!");
}
}
程序运行结果:
人吃饭
人睡觉
男人大口吃饭
男人粗鲁地睡觉
男人怎能不抽烟!
女人小心翼翼地吃饭
女人孤独地睡觉
女人如何不购物!