JAVA中调用一个抽象类的抽象方法时会怎样?

来源:百度知道 编辑:UC知道 时间:2024/04/30 14:50:43
JAVA中调用一个抽象类的抽象方法时,程序是否转而去调用它的子类中的同名已具体化的方法?不知我把问题说清楚没有。
正如楼下的这段程序,为什么T1 t12 = new T2()后执行t12.say()就去调用T2里的say()方法而不是去调用T3里的say()方法?这里还有些不明白。

抽象类: 动物 有方法 cry();
具体类1: 猫 extends 动物 实现方法cry(){“喵喵~” }
具体类2: 狗 extends 动物 实现方法cry(){“旺旺~” }

动物 dog = new 狗();
动物 cat = new 猫();

cat.cry();//结果是喵喵~ 叫
dog.cry();//结虹是旺旺~ 叫

由于dog是new 出来的是狗 而cat是new出来的猫,所以虽然大家都属于动物,但其实不是同一种动物。 并且想让狗学猫叫,猫学狗叫是不可能的

动物 dog=new 狗(); 其实相当于理解成以下两条语句
1。狗 dg = new 狗();
2。动物 dog=(动物)dg;//将dg的狗类型转化成了动物类型

所以调用时当然只会调用狗的方法旺旺旺,而不会去调用其它动物的方法!

所以问题的关键在于生成时是 new 狗还是new 猫! 因为动物是不能被new出来的(抽象类不能实例化)所以我们就能分出执行的是哪个方法;

T1 t12 = new T2();这个是实例化的一个T2类型并且用一个T1类型的引用指向它。当然执行t12.say();会执行T2里面的咯,因为实例化的对象是T2而不是T3

说实话会!

不知道你能明白不能
//设T1为动物.
abstract class T1 {
public abstract void say();
}
//T2为猫
class T2 extends T1 {

@Override
public void say() {
System.out.println("T2.say");

}
}
//T3为狗
class T3 extends T1 {

@Override
public void say() {