多态
同一个对象 体现出来的多种不同形态(身份) 将同一种行为表现出不同效果;
要想实现多态的效果 需要先有继承关系
体现:
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("帅气离开");
}
}