两个没有继承关系的类 引用之间是不可以转换的 因为对象的类型是不可变的 即使强转也不成功 编译也不通过
案例:
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){Cat c =newCat();Dog d =(Dog)c;}}classAnimal{publicvoideat(){System.out.println("动物吃");}publicvoidsleep(){System.out.println("动物睡");}}//定义一个 狗类 继承 动物类 叫classDogextendsAnimal{//重写 吃和睡publicvoideat(){System.out.println("狗舔着吃屎");}//叫publicvoidshout(){System.out.println("狗叫");}}classCatextendsAnimal{publicvoideat(){System.out.println("猫喵喵的吃鱼");}publicvoidsleep(){System.out.println(" 猫妩媚的睡");}}classErHaextendsDog{publicvoideat(){System.out.println("二哈");}publicvoidsleep(){System.out.println(" 二哈");}publicvoidfanEr(){System.out.println("犯二");}}
instanceof语句
语句语法:
父类引用 instanceof 子类类名
结果是 boolean
案例:
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){//Animal a = new Dog();Animal a =newCat();if(a instanceofDog){Dog d =(Dog)a;
d.eat();
d.sleep();
d.shout();}else{
a.eat();
a.sleep();}}}classAnimal{publicvoideat(){System.out.println("动物吃");}publicvoidsleep(){System.out.println("动物睡");}}//定义一个 狗类 继承 动物类 叫classDogextendsAnimal{//重写 吃和睡publicvoideat(){System.out.println("狗舔着吃屎");}//叫publicvoidshout(){System.out.println("狗叫");}}classCatextendsAnimal{}
案例:
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){//Animal a = new Dog();Animal a =newCat();Dog a =newDog();//Cat c = new Cat();if(c instanceofDog){Dog d =(Dog)c;
d.eat();
d.sleep();
d.shout();}else{
c.eat();
c.sleep();}}}classAnimal{publicvoideat(){System.out.println("动物吃");}publicvoidsleep(){System.out.println("动物睡");}}//定义一个 狗类 继承 动物类 叫classDogextendsAnimal{//重写 吃和睡publicvoideat(){System.out.println("狗舔着吃屎");}//叫publicvoidshout(){System.out.println("狗叫");}}classCatextendsAnimal{}
多态的应用
多态用在数组中
案例: 有 狗 猫 羊 猴子 老虎 继承 动物类
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){//分别创建子类的对象 调用吃的方法/*Dog d = new Dog();
Cat c = new Cat();
Sheep s = new Sheep();
Monkey m = new Monkey();
Tiger t = new Tiger();
d.eat();
c.eat();
s.eat();
m.eat();
t.eat();*/Animal[] animals ={newDog(),newCat(),newSheep(),newMonkey(),newTiger()};//遍历for(int i =0;i<animals.length;i++){
animals[i].eat();
animals[i].sleep();}}}classAnimal{publicvoideat(){System.out.println("动物吃");}publicvoidsleep(){System.out.println("动物睡");}}//狗classDogextendsAnimal{publicvoideat(){System.out.println("狗吃骨头");}}//羊classSheepextendsAnimal{publicvoideat(){System.out.println("羊吃草");}}//猫classCatextendsAnimal{publicvoideat(){System.out.println("猫吃鱼");}}//猴子classMonkeyextendsAnimal{publicvoideat(){System.out.println("猴子吃桃");}}//老虎classTigerextendsAnimal{publicvoideat(){System.out.println("老虎吃羊");}}
多态用在方法的参数上
能够提高方法的通用性
案例:
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){//分别创建子类的对象 调用吃的方法/*Dog d = new Dog();
Cat c = new Cat();
Sheep s = new Sheep();
Monkey m = new Monkey();
Tiger t = new Tiger();*/useEat(newDog());useEat(c);useEat(s);useEat(m);useEat(t);}publicstaticvoiduseEat(Animal a){
a.eat();}}classAnimal{publicvoideat(){System.out.println("动物吃");}publicvoidsleep(){System.out.println("动物睡");}}//狗classDogextendsAnimal{publicvoideat(){System.out.println("狗吃骨头");}}//羊classSheepextendsAnimal{publicvoideat(){System.out.println("羊吃草");}}//猫classCatextendsAnimal{publicvoideat(){System.out.println("猫吃鱼");}}//猴子classMonkeyextendsAnimal{publicvoideat(){System.out.println("猴子吃桃");}}//老虎classTigerextendsAnimal{publicvoideat(){System.out.println("老虎吃羊");}}classChickextendsAnimal{}