多态
同一个对象 体现出来的多种不同形态(身份) 将同一种行为表现出不同效果;
要想实现多态的效果 需要先有继承关系
体现:
1.父类类型的引用 指向 子类的对象
Person p=new Teacher();//向上转型
2.该引用只能调用父类中定义的属性和方法;
3.如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果;
如果父类与子类有同名的属性 调用父类的属性;(属性无重写,方法可以有重写)
如果父类与子类有同名的方法(重载) 执行子类重写之后的方法;
4.如果想要调用子类独有的属性或方法
需要将类型还原回真实类型 强制类型转化 造型 向上转型 向下转型
Teacher t=(Teacher)p; //向下转型
5.造型时(强制向下转型时)可能会出现一个运行时异常
ClassCastException //造型异常;
可以用if(p instanceof Teacher){//对象是否属于后面类型
}
=============================================================
设计模式--行为模式--策略模式;
public abstract class Person{ protected String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } public abstract void callNumber(); public abstract void transact(); public abstract void leave(); }
public class Bank{ /* public void welcome(OldMan om){ System.out.println(om.getName()+"客户进入银行"); om.callNumber(); om.transact(); om.leave(); } public void welcome(YoungMan om){ System.out.println(om.getName()+"客户进入银行"); om.callNumber(); om.transact(); om.leave(); } public void welcome(Toff om){ System.out.println(om.getName()+"客户进入银行"); om.callNumber(); om.transact(); om.leave(); } */ public void welcome(Person om){ System.out.println(om.getName()+"客户进入银行"); om.callNumber(); om.transact(); om.leave(); } }
public class Test{ public static void main(String[] args){ Bank bank=new Bank(); //Person omm=new Toff("突突"); //Person omm=new OldMan("老张"); Person omm=new YoungMan("少年"); bank.welcome(omm); System.out.println(); /* Bank bank=new Bank(); OldMan omm=new OldMan("张大爷"); bank.welcome(omm); System.out.println(); YoungMan ommk=new YoungMan("小张"); bank.welcome(ommk); System.out.println(); Toff ommkt=new Toff("土豪"); bank.welcome(ommkt); */ } }
public class OldMan extends Person{ //private String name; public OldMan(){}; public OldMan(String name){ this.name=name; }//构造方法; /* public void setName(String name){ this.name=name; } public String getName(){ return name; } */ public void callNumber(){ System.out.println("在哪叫号?"); } public void transact(){ System.out.println("拿出存折"); } public void leave(){ System.out.println("慢慢离开"); } }
public class YoungMan extends Person{ //private String name; public YoungMan(){}; public YoungMan(String name){ this.name=name; }//构造方法; /* public void setName(String name){ this.name=name; } public String getName(){ return name; } */ public void callNumber(){ System.out.println("柜台取号"); } public void transact(){ System.out.println("拿出银行卡"); } public void leave(){ System.out.println("离开"); } }
public class Toff extends Person{ //private String name; public Toff(){}; public Toff(String name){ this.name=name; }//构造方法; /* public void setName(String name){ this.name=name; } public String getName(){ return name; } */ public void callNumber(){ System.out.println("VIP室"); } public void transact(){ System.out.println("拿出黑卡"); } public void leave(){ System.out.println("帅气离开"); } }