多种状态:就是指一个对象可以有多种状态(他在继承体系中的位置变化)
D->C->B->A->Animal,位置的变化只能是向上变 但不能低于自身,对于C而言可以当做B来看,也可以当做A来看也可以当Animal,小明 -->男人-->人-->动物, 小明的学校开家长会,小明不想让他爸爸去,他让大明去,大明就是小明他哥,大明冒充Dad去参加家长会的话,那么所表现出来的行为,是不是应该符合他爸行为,不同的视角,不同的角色, 无论是在哪个视角场合,对象本身变了没有?只不过我们需要对象在不同的场合表现出相对应的行为, 在Java当中 多态代码表现 就是 父类引用指向子类的对象
package test2;public class DuoTaiDemo01 {public static void main(String[] args) {Son s=new Son(); //子类的四个方法都能够打印出来 s.chouyan();s.hejiu();s.tangtou();s.lol();Dady d =new Son();/*** 只能打印出子类继承父类的方法内容,不能打印出子类特有的方法* Dady d =new Son();这就是父类引用指向子类的对象*/ d.chouyan();d.hejiu();d.tangtou(); }
}class Dady{void chouyan() {System.out.println("爸爸抽烟"); }void hejiu(){System.out.println("爸爸喝酒"); }void tangtou() {System.out.println("爸爸烫头"); } }class Son extends Dady{@Overridevoid chouyan() {// TODO Auto-generated method stubSystem.out.println("儿子抽烟");}@Overridevoid hejiu() {// TODO Auto-generated method stubSystem.out.println("儿子喝酒");}@Overridevoid tangtou() {// TODO Auto-generated method stubSystem.out.println("儿子烫头");}void lol() {System.out.println("儿子lol"); }}
多态的前提:继承 重写
多态的好处:对代码的功能进行了可扩展性
子类对象可以当做父类对象去使用 但是有限制,只能调用父类函数或重写的函数, 不能使用子类特有的行为
多态当中 成员变量的特点:只能访问父类中的成员变量
多态当中 成员函数的特点:
如果子类没有重写 且父类中有 调用父类的
如果子类有重写 调用子类重写的
如果不存在重写 父类没有 那就报错了!
package test2;
public class DuoTaiDemo02 {public static void main(String[] args) {dog d =new dog();cat c =new cat();Pig p =new Pig();/*** d.eat();c.eat();p.eat();*/
feed(d);//相当于Animal a =new dog()父类引用指向子类对象,向上转型
feed(c);//相当于Animal a = new Cat()父类引用指向子类对象,向上转型
feed(p);//相当于Animal a =new Pig()父类引用指向子类对象,向上转型 }public static void feed(Animal a) {a.eat();//向上转型if(a instanceof Pig) {Pig p = (Pig)a;p. gongBaiCai();} /*** Animal a =new dog()* Animal a =new Pig()*/}
}
class Animal{void eat() {}void jiao() {}
}
class Pig extends Animal{void eat() {System.out.println("猪啥都吃。。。。"); }void jiao() {System.out.println("猪哼哼。。。");}void gongBaiCai() {System.out.println("猪共白菜。。。。");}
}
class dog extends Animal{void eat() {System.out.println("狗吃狗粮。。。。");}void jiao() {System.out.println("狗汪汪。。。。");}void lookdoor() {System.out.println("狗看家。。。。");}
}
class cat extends Animal{void eat() {System.out.println("狗吃鱼。。。。");}void jiao() {System.out.println("狗喵喵。。。。");}void catchMouse() {System.out.println("狗捉老鼠。。。。"); }
}
要注意向下向上转型的问题