对多态的理解,示例
多态指的是一个对象体现出多种不同的形态,可以将同一种行为表现出不同的效果。
多态的表现形式:
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); } }