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

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(),结果没有如我所愿,为什么呢?

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

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

父类中调用到的方法,

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

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

 

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

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

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

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的代码。

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