对多态的理解,示例

多态指的是一个对象体现出多种不同的形态,可以将同一种行为表现出不同的效果。

多态的表现形式:

1.多态的前提需要有继承关系

2.使用父类的引用指向子类对象-向上转型

3.父类引用只能调用父类中的属性跟方法

4.如果调用属性,执行父类的,如果调用方法,看子类是否重写该方法。

5.若想调用子类独有的成员,将身份还原回去(造型-向下转型)

若需要转换的类型与真实对象类型不匹配,会产生一个运行时异常ClassCastException

6.为了避免转型时产生问题,可以利用instanceof进行判断前面的对象与后面的类是否匹配

package bank;

public abstract class Person {
        protected String name;
        public Person(){}
        public Person(String name){
            this.name=name;
        }
        public abstract String getName();
        //1.进银行,排好
        public abstract void CallNumber();
        //2.办理
        public abstract void handle();
        //3.离开
        public abstract void leave();
}
package bank;

public class Bank {
    public void business(Person p){
        p.CallNumber();
        p.handle();
        p.leave();
    }
}
package bank;

public class OldMan extends Person{
    public String getName(){
        return this.name;
    }
    public OldMan(){
        
    }
    public OldMan(String name){
        this.name=name;
    }
    
    //1.进银行,排号
    public void CallNumber(){
        System.out.println("老年人进门取号");
    }
    //2.办理
    public void handle(){
        System.out.println("杵着拐走到窗口坐下,开始办理业务");
    }
    //3.离开
    public void leave(){
        System.out.println("收好钱,慢慢离开银行");
    }

}
package bank;

public class YoungMan extends OldMan{
    public String str="nbClass";
    public YoungMan(){
        
    }
    public YoungMan(String name){
        this.name=name;
    }
    public String getName(){
        return this.name;
    }
    //1.进银行 叫号
    public void CallNumber(){
        System.out.println("手机叫号");
    }
    //2.办理
    public void handle(){
        System.out.println("自助终端办理");
    }
    //离开
    public void leave(){
        System.out.println("跑着离开了");
    }
}
package bank;

public class RichMan extends Person{
    public RichMan(){
        
    }
    public RichMan(String name){
        this.name=name;
        
    }
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return this.name;
    }
        //1.进银行 叫号
        public void CallNumber(){
            System.out.println("进门,客户经理迎接");
        }
        //2.办理
        public void handle(){
            System.out.println("业务经理帮忙办理");
        }
        //离开
        public void leave(){
            System.out.println("行长送我离开");
        }
        
}
package polymorphic;

import bank.Bank;
import bank.OldMan;
import bank.Person;
import bank.RichMan;
import bank.YoungMan;

//多态设计,父类的引用指向子类对象,具体需要哪个子类自己决定,然后调用方法时,首先看是否在Person中有定义,如果有定义则再看是否在子类重写过,重写过就调用子类重写后的方法。
//没有重写就调用父类的(如果父类这个方法没有实现当然就不调咯),属性的话,只看Person也就是抽象父类,父类的引用调不到子类的属性,除非向下转型
public class TestPolymorphic {
    public static void main(String[] args){
        Bank bank=new Bank();
//        Person p=new RichMan();
//        Person p=new OldMan();
        Person p=new YoungMan("王二麻子");
//        System.out.println(p.getName());
//        YoungMan ym=(YoungMan)p;
//        System.out.println(ym.str);
        bank.business(p);
    
    }
}
原文地址:https://www.cnblogs.com/hebiao/p/12875139.html