面向对象的特征之三:多态

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("女人如何不购物!");
	}
}

程序运行结果:
人吃饭
人睡觉
男人大口吃饭
男人粗鲁地睡觉
男人怎能不抽烟!
女人小心翼翼地吃饭
女人孤独地睡觉
女人如何不购物!

猜你喜欢

转载自blog.csdn.net/weixin_42039602/article/details/81112606