Java和C++子类转换成父类,方法调用的不同之处及原因
这个是java和c++一个很重要的区别,在c++中,可以通过这样向上提升的类型操作实现对父类行为的调用,而在Java中,无论对其进行什么样的类型转换,其类型实际上是不变的。
举个简单的例子,C++中
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中确实相反,请看以下代码:
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中的对象如何进行类型提升,依然保持其原有的类型。
但是要注意一点就是如果父类和子类中那个继承的方法被改为static,那么调用的时候就会显示的是父类的行为。原因很简单,因类型被提升Base,而静态方法是属于类的而不是对象的,因此多态消失。
今天也是碰到这问题好好总结了一下,希望能够对看到的人有所帮助。