notys's blog
大道至简
OOP-多态

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

1.多态性的理解: 可以理解为一个事物的多种形态

2.何为多态性: 对象的多态性: 父类的引用指向子类的对象(或子类的对象赋给父类的引用)

3.多态的使用: 虚拟方法调用

有了对象的多态性以后,在编译期,只能调用父类中声明的方法.但在运行期,实际执行的是子类重写父类的方法

4.总结: 编译看左,运行看右

5.多态性的使用前提: ①类的继承关系 ② 方法的重写

6.多态性不适用于属性:编译和运行都看左边

Person类

package cc.duotai;

public class Person {
	
	String name;
	int age;
	
	public void eat() {
		System.out.println("人,吃饭");
	}
	public void walk() {
		System.out.println("人,走路");
	}
}

Man类

package cc.duotai;

public class Man extends Person{
	
	boolean isSmoking;
	
	public void earMaoney() {
		System.out.println("挣钱养家");
	}
	//重写eat,walk方法
	public void eat() {
		System.out.println("男人多吃肉,挣更多的钱");
	}
	public void walk() {
		System.out.println("男人霸气的走路");
	}
}

PersonTest 类

package cc.duotai;

public class PersonTest {
	public static void main(String[] args) {
		
		Person p1 = new Person();
		p1.eat();
		
		Man man = new Man();
		man.eat();
		man.age=18;
		man.name="张三";
		man.earMaoney();
		System.out.println(man.name);
		
		
		System.out.println("***************");
		
		//对象的多态性:父类的引用指向子类的对象
		Person p2 = new Man();//编译看左,运行看右
		//多态的使用,当调用子父类的同名同参数的方法时,实际执行的是子类重写父类的方法---》虚拟方法调用
		p2.eat();
		p2.walk();
		
		//The method earMoney() is undefined for the type Person
//		p2.earMoney();
		
	}
}

举例

package cc.duotai;

public class AnimalTest {
	
	public static void main(String[] args) {
		
		AnimalTest test = new AnimalTest();
		test.func(new Dog());
		test.func(new Cat());
		
	}
	
	
	public void func(Animal animal) {//Animal animal = new Dog();
		animal.eat();
		animal.shout();
	}
}
//父类
class Animal{
	
	public void eat() {
		System.out.println("动物:进食");
	}
	public void shout() {
		System.out.println("动物:叫");
	}
}
//子类 Dog
class Dog extends Animal{
	
	public void eat() {
		System.out.println("狗吃狗粮");
	}
	public void shout() {
		System.out.println("汪 汪 汪");
	}
}
//子类 Cat
class Cat extends Animal{
	
	public void eat() {
		System.out.println("猫吃鱼");
	}
	public void shout() {
		System.out.println("喵 喵 喵");
	}
}