古月慕南
2015-11-16 07:19
采纳率: 100%
浏览 2.8k
已采纳

关于如何通过子类调用父类的父类中的方法

package access;
class A{
public A(){System.out.println("A created!");}
public int f(){
System.out.println("call A.f()");
return 1;
}
}
class B extends A{
public int f(){
System.out.println("call B.f()");
return 2;
}
public B(){System.out.println("B created!");}
}
class C extends B{
public int f(){
System.out.println("call C.f()");
return 3;
}
}
public class Test01{
public static void main(String args[]){
C c = new C();
System.out.println(((A)c).f());
}
}
将c转型成A,试图调用A中的f(),结果没有如我所愿,为什么呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • 不想说话的猴子 2015-11-16 07:44
    已采纳

    首先在子类中调用被重写的父类方法,这个想法就非常怪,既然被重写了肯定是想调用重写后的想法,如果真的还想调用父类被重写的方法,最直接的还是:
    A a = new A();
    System.out.println(a.f());
    就ok。
    (A(c)).f();这里你只是把c的类型强制转换成了它的父类,但c本身是重写了f()方法的,你再转换它类型也是没用的,C只会调用它自己的f()方法。具体super关键字一般在构造函数里面用调用父类的构造函数,所以这里压根就不起作用。

    点赞 评论
  • czy0802 2015-11-16 07:26

    不用把c转换成A吧,你直接用c.f();就可以调用A的f()方法啊

    点赞 评论
  • Robot-S 2015-11-16 07:29

    父类中调用到的方法,

    1. 如果希望被子类覆盖,即调用子类的方法,需要定义成protected或者public。

    2. 如果不希望调用子类的方法,定义成privated

     

    下面以父类AAA和子类BBB为例进行说明

    1. 父类调用子类的方法,输出BBB

    public class AAA {
        protected String getName(){
      ......
    答案就在这里:父类调用子类方法
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

    点赞 评论
  • wanghang1208 2015-11-16 08:49

    1、这就是java语言的多态性。

    2、考虑以下代码:

    A a = new C();
    a.f();
    

    访问方法:a的编译时类型是A,其只能调用A具有的方法,否则编译出错,你可以把A的方法f()改成g()试试。
    a的运行是类型是C,所以程序运行时,调用的是C的方法。

    访问属性:a的编译时类型是A,其只能调用A具有的属性,否则编译出错,你可以为C添加属性,然后用a访问试试。
    a的运行是类型是C,但是程序运行时,调用的是A的属性。

    3、考虑你的代码:

    C c = new C();
    

    编译时、运行时类型都是C,无法访问A的代码。

    点赞 评论
  • weixin_32769751 2015-11-16 15:07

    爷爷类指向孙子类,A() a=new C()

    点赞 评论

相关推荐 更多相似问题