class A{ void a(){ System.out.println("parent'a()"); }}class AA extends A{ void a(){ System.out.println("child'a()"); }}public static void main(String[] agrs){ AA aa = new AA(); aa.a(); A a = (A)aa; a.a();}这两种打印出来的结果都是一样的,怎么才能调用A中的a方法,在不改变 A 和AA的方法的情况下。
answer:
子类调用父类中被重写的方法,用super.被重写的方法()即可!
|
这个是java和c++一个很重要的区别,在c++中,可以通过这样向上提升的类型操作实现对父类行为的调用,而在Java中,无论对其进行什么样的类型转换,其类型实际上是不变的。 举个简单的例子,C++中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class A {
public :
void print(){
cout<< "Class A" <<endl;
}
};
class B: public A{
public :
void print(){
cout<< "Class B" <<endl;
}
};
int main(){
B b;
A a = (A)b;
a.print();
A *aa = new B();
aa->print();
cout<< typeid (a).name()<<endl;
system ( "PAUSE" );
return 0;
}
|
输出的结果是 Class A Class A 1A 说明通过类型提升b对象类型已经变成A类型。因此调用A中的行为,自然显现的是A的行为。 但是这个在java中确实相反,请看以下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Base{
public String getFields(){
return "Base" ;
}
}
class Agg extends Base{
public String getFields(){
return "AGG" ;
}
public String getSuperFiedls(){
return super .getFields();
}
}
|
执行该代码 Agg agg = new Agg(); Base base = new Agg(); if(base instanceof Agg) System.out.println("Class Agg"); else System.out.println("Class Base"); System.out.println(base.getFields()); System.out.println(agg.getSuperFiedls()); 结果 Class Agg AGG Base 由此可将,无论将Java中的对象如何进行类型提升,依然保持其原有的类型。 今天也是碰到这问题好好总结了一下,希望能够对看到的人有所帮助。 |
|