Java中 通过子类怎么调用父类已经被重写的方法

lehui1028583476 2012-08-12 12:28:26
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的方法的情况下。
...全文
给本帖投票
4859 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨鸟先飞吧 2013-09-24
  • 打赏
  • 举报
回复
class AA extends A{ void a(){ super.a(); System.out.println("child'a()"); } }
Ididcan 2012-09-12
  • 打赏
  • 举报
回复
13楼正解,这个是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中的对象如何进行类型提升,依然保持其原有的类型。

今天也是碰到这问题好好总结了一下,希望能够对看到的人有所帮助。
valance_1 2012-08-13
  • 打赏
  • 举报
回复
对的,用super 正解
Wentasy 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

子类调用父类中被重写过的方法,用super.被重写方法() 即可!
[/Quote]

支持13楼。
wonkju 2012-08-12
  • 打赏
  • 举报
回复
你向上转型的时候,其实调用的方法是被子类覆写了的方法,也就是多态,你可以new 子类对象,如果用super.方法(),就可以了哈。
宏Lee 2012-08-12
  • 打赏
  • 举报
回复
那的写法和
A a = new AA();这样写没区别,多态
lehui1028583476 2012-08-12
  • 打赏
  • 举报
回复
其实我就是想知道怎么通过只类来访问已经被重写的方法!
他的类型改变了为什么还是指向的是AA 没有指向A。
weitao1234 2012-08-12
  • 打赏
  • 举报
回复
想要调用A中的那个方法,必须要有那个对象的实例。A a = (A)aa;这样写,那个真正的对象还是AA,所以它就会调用AA中的那个方法。
宏Lee 2012-08-12
  • 打赏
  • 举报
回复
A a = (A)aa;
你的这个写法其实就是多态写法,运行的时候,还是AA,因为你重写的父类的方法,想调用父类的方法,你只有直接去new父类A a = new A();
噢噢噢噢 2012-08-12
  • 打赏
  • 举报
回复

class AA extends A{
void a(){
System.out.println("child'a()");
}
void sa(){
new A().a();
}
}



a.sa();
老紫竹 2012-08-12
  • 打赏
  • 举报
回复
AA aa = new AA();

既然你构造的是AA,那么就别再想着A了。
金墨痴 2012-08-12
  • 打赏
  • 举报
回复
静态方法
zlw1207 2012-08-12
  • 打赏
  • 举报
回复
子类调用父类中被重写过的方法,用super.被重写方法() 即可!
lehui1028583476 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

这个是子类调用父类,AA a =new A(),再调用就没问题了
[/Quote]

会报错的,子类不能显式转换成父类
suwen 2012-08-12
  • 打赏
  • 举报
回复
这个是子类调用父类,AA a =new A(),再调用就没问题了
lehui1028583476 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

反射?
[/Quote]

怎么反射 ,刚才看了一点,怎么反射才能得到A这个类呢!
结贴是美德 2012-08-12
  • 打赏
  • 举报
回复
反射?

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部