面向对象特征之三:多态性
-
理解多态性:可以理解为一个事物的多种形态
-
何为多态性:
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
-
多态的使用:虚拟方法调用
有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
总结:编译,看左边;运行,看右边。
-
多态性的使用前提: ① 类的继承关系 ② 方法的重写
-
对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)
Person类
package day06;
public class Person {
String name;
int age;
public void eat() {
System.out.println("人:吃饭");
}
public void walk() {
System.out.println("人:走路");
}
}
Man类
package day06;
public class Man extends Person {
boolean isSmoking;
public void earnMoney() {
System.out.println("男生负责挣钱");
}
public void eat() {
System.out.println("男生饭量大");
}
public void walk() {
System.out.println("男生走路快");
}
}
Woman类
package day06;
public class Woman extends Person {
boolean isBeauty;
public void earnMoney() {
System.out.println("女生负责貌美如花");
}
public void eat() {
System.out.println("女生饭量小");
}
public void walk() {
System.out.println("女生走路慢");
}
}
PersonTest类
package day06;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.eat();
Man man = new Man();
man.eat();
man.age = 25;
man.earnMoney();
//对象的多态性:父类的引用指向子类的对象
System.out.println("**************************************");
Person p2 = new Man();
//多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写的方法-------虚拟方法调用
p2.eat();
p2.walk();
//p2.earnMoney();不能调用,声明的是Person类
Person p3 = new Woman();
}
}
案例2:
package com.atguigu.java4;
import java.sql.Connection;
//多态性的使用举例一:
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();
if(animal instanceof Dog){
Dog d = (Dog)animal;
d.watchDoor();
}
}
// public void func(Dog dog){
// dog.eat();
// dog.shout();
// }
// public void func(Cat cat){
// cat.eat();
// cat.shout();
// }
}
class Animal{
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("汪!汪!汪!");
}
public void watchDoor(){
System.out.println("看门");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("喵!喵!喵!");
}
}
//举例二:
class Order{
public void method(Object obj){
}
}
//举例三:
class Driver{
public void doData(Connection conn){//conn = new MySQlConnection(); / conn = new OracleConnection();
//规范的步骤去操作数据
// conn.method1();
// conn.method2();
// conn.method3();
}
}