java - 基础 - 多态

多态(Polymorphism):

同一个对象体现出的不同形态,将一种行为体现出不同效果。

实现:父类引用指向子类

 

animal

public class Person extends Animal{

}

Animal a = new Person();

此时a能调用person中的方法

如果父类和子类有相同的属性,调用父类的。

如果子类中重写了父类的方法,则调用的是子类中重写的方法。

如果父类想调用子类独有的方法,需要强制转化

Person  p = (Person)a;

 

package Polymorphism;

public class Animal {

    int age = 1;

    public void setAge(){
        age = 10;
        System.out.println("Animal类中的setAge方法");
    }

}
package Polymorphism;

public class Person extends Animal {

    int age = 2;
    String name;

    public void setName(){
        String name = "aaa";
        System.out.println("Person类中的setName方法");
    }

    public void getName(){
        System.out.println("Person类中的getName方法:name = " + name);
    }

    public void setAge(){
        age = 20;
        System.out.println("Person类中的setAge方法");
    }

    public void getAge(){
        System.out.println("Person类中的getAge方法:age = " + age);
    }
}

 

 

package Polymorphism;

import java.net.SocketTimeoutException;
import java.util.Scanner;

public class Test {

    public static void main(String[] args){
        Animal a = new Person();//多态

        System.out.println(a.age);//如果父类和子类有相同的属性,调用父类的。

        a.setAge();//如果子类中重写了父类的方法,则调用的是子类中重写的方法。

        Person p = (Person) a;//如果父类想调用子类独有的方法,需要强制转化
        p.getAge();


        Object o = new Person();
        Animal aa = null;
        //避免转换异常,可以使用instanceof判断,不能转换(没有继承关系)会直接报错不能编译,如果是 a instanceof b, 且a是b的对象或者子类对象,会返回true
        if(o instanceof Animal){   //o new的是一个Person对象,是animal的子类
            System.out.println("o与Animal可以匹配");
            aa = (Animal)o;//向下强制转换,寻找方法中从Person向父类寻找,Person中有setAge的重写,所以执行的是Person的
            // 能执行的方法和属性是从Animal开始向父类找(必须是Animal或者其父类定义过),执行的方法和属性是从定义时new的Person开始向父类找,有重写的优先运行重写的。
        }
        else{
            System.out.println("o与Animal不匹配");
        }
        System.out.println(a.age);
        aa.setAge();

        Object oo = new Animal();

        if(oo instanceof Person){  //oo声明的是Animal对象,是Person的父类,所以返回false
            System.out.println("oo与Person可以匹配");
        }
        else{
            System.out.println("oo与Person不匹配");
        }

    }
}

 

 

多态的应用:

比如银行取号时,父类为public abstract  class person,子类为不同类型的客户,这样银行可以统一处理客户,而不同客户可以重写他们各自独立的方法。

package Polymorphism.bank;

public abstract class Customer {
    protected String name; //子类可以直接使用

    public abstract void come();
}
package Polymorphism.bank;

public class VIPCustomer extends Customer{

    public VIPCustomer(String name){
        this.name = name;
    }

    public void come(){
        System.out.println("VIP客户" + name + "开始办理业务。");
    }
}
package Polymorphism.bank;

public class CommenCustomer extends Customer{
    public CommenCustomer(String name){
        this.name = name;
    }

    public void come(){
        System.out.println("普通客户" + name + "开始办理业务。");
    }
}
package Polymorphism.bank;

public class Bank {

    public void dealwithCustomer(Customer c){
        c.come();
    }

    public static void main(String[] args){
        Bank b = new Bank();
        Customer vip = new VIPCustomer("王健");  //利用多态对客户进行分类,调用他们重写的方法。
        Customer com = new CommenCustomer("张益");

        b.dealwithCustomer(vip);
        b.dealwithCustomer(com);
    }
}

 

posted @ 2019-09-29 10:41  不咬人的兔子  阅读(172)  评论(0编辑  收藏  举报