多态的个人理解
多态和向上转型以及向下转型
我感觉如果你理解多态和向上转型以及向下转型有点晕,就是没有理解程序整个的运行过程,重点是程序运行时需要先进行编译。
---我思故我在
先说一下基本概念:
多态:顾名思义就是一种行为,多种状态,多态指的是方法的多态,属性在这里没有多态,但是现实世界中是有多态的。
多态的三个必要条件:继承,方法的重写,以及父类引用指向子类对象(也就是自动的向上转型)。
重点是:程序运行需要先进行编译,然后才会运行
编译:只是检查语法错误 而运行才会考虑对象使用这个方法正不正确,所以说,即时编译通过了,也不一定可以运行出来。所以说异常可以分为编译时异常和运行时异常。
public class Animal { public void shout(){ System.out.println("叫了一声"); } } class Dog extends Animal{ @Override public void shout() { System.out.println("汪汪汪!"); } public void lookDoor(){ System.out.println("看门"); } } class Cat extends Animal{ @Override public void shout() { System.out.println("喵喵喵!"); } public void eatFish(){ System.out.println("吃鱼"); } } class Mouse extends Animal{ }
这个代码里面有三个类,一个父类为Animal 三个子类 分别是:Dog Cat 以及Mouse ,他们三个类继承了Animal类 重写了动物类中的shout方法 而他们三个类中都还有各自独有的方法。
/** * 多态:前提条件 继承 重写 父类引用指向子类对象 * 好处:非常灵活,减少类和类之间的耦合以及减少许多重载 */ public class Main { static void animalCry(Animal d){ d.shout(); } public static void main(String[] args) { Dog dog=new Dog(); Animal a=new Dog(); Animal b=new Dog(); // b.lookdoor();//这里会报错,编译通不过,因为b 现在是Animal 但是Animal里面没有look door方法 Dog b2=(Dog)b; b2.lookDoor(); animalCry(a); animalCry(dog); animalCry(new Cat()); animalCry(new Mouse()); } }
这个类是测试类,在这个类里面有两个方法,定义了一个 animalCry方法,里面需要传一个Animal类型的对象,对象来调用里面的shout方法
第二个方法是main方法,用来程序的执行。
流程:Animal a =new Dog(); 这个是自动向上转型,也就是父类引用指向子类对象,但是这个对象a
不可以调用Dog类中的lookDoor 方法,因为在编译的时候,编译器就会认为这个是一个Animal类型的对象,Animal类中没有look
Door方法,所以编译通不过。只有对他进行向下转型的时候,也就是强制转型, Dog b2=(Dog)b;才可以调用。
但是为啥上面的animalCry 里面传进去的是一个Animal 类型的对象,但是就不是调用Animal里面的shout 方法呢 ?因为编译器识别的时候,会识别出来狗这个对象也是animal ,所以编译通过,但是执行的时候,他是什么就是什么,是狗就调用狗的shout方法,是猫就调用猫的shout方法。所以说重点在编译,重点在理解编译和执行的过程就会对这个有更加深刻的理解
再比如,如果
Animal a=new Dog(); 这个
如果你想把a转成Cat 这个是可以的,编译会通过,Cat a2=(cat)a;
但是a2不可以调用猫里面的吃鱼的方法,因为这个运行通不过,所以,编译器非常傻瓜,只会检查语法,但是实际执行起来,是啥就是啥,猫不会变成狗
本文来自博客园,作者:(HelloWorld!),转载请注明原文链接:https://www.cnblogs.com/Simon-s/p/15643549.html --有志者,事竟成

浙公网安备 33010602011771号