二重继续,都有相同的方法,怎么样在第三层访问最顶层的同名方法?
这个问题,是我在看《Think in Java》的时候,突然想到的,不知道行不行,想测试,我没有测试通过,不知道是不行吗,还是我没有找对方法。
如下面三个类:
如下面三个类:
abstract
class
A {
void
p()
{
System.
out
.println(
"A"
);
}
}
public
class
B
extends
A {
void
p()
{
super
.p();
//
调用
A
中的
p()
方法
System.
out
.println(
"B"
);
}
}
public
class
C
extends
B {
/**
*
怎么样在
C
里面,不创建新类的情况下,怎么样访问
A
里面
p()
方法?结果只打印“A”
*状态:还没有解决
*状态:还没有解决
*/
void
p()
{
super
.p();
//
只能够调用
B
中的
p()
方法
//super.super.p();//
没有这种用法
//A a=new A();//
抽象类不允许实例化
//
怎么样去访问
A
中的
p()
方法?
System.
out
.println(
"C"
);
}
public static void main(String[] arg)
{
//new C().p();
//A a=new C();
A a=new C();//向上转型,后面的类转换为基类,与其它类转换为Object类一样
a.p();
//以上的这种操作方式打印出来的也是ABC
}
}
答案:
由
Donnki解决,解决方法是采用匿名内部类,可是原理还没有弄懂,希望
Donnki能够回来继续说明一下原理,或者知道的朋友请补充一下。
(找到一点答案,来自群里的BOIN:匿名内部类,实际就是新建一个类继承了A.匿名内部类是默认的对被匿名的类的继承,比如常用的swing框架中的对事件的绑定 就要在匿名内部类中继承并重写ActionLinstener基类的 actionPerform方法。其实(匿名)内部类是用来解决Java回调机制的)
将C里面的main方法写成如下:
(找到一点答案,来自群里的BOIN:匿名内部类,实际就是新建一个类继承了A.匿名内部类是默认的对被匿名的类的继承,比如常用的swing框架中的对事件的绑定 就要在匿名内部类中继承并重写ActionLinstener基类的 actionPerform方法。其实(匿名)内部类是用来解决Java回调机制的)
将C里面的main方法写成如下:
public
static
void
main(String[] arg)
{
//new C().p();
//A a=new C();
//A a=new C();//
向上转型,后面的类转换为基类,与其它类转换为
Object
类一样
//a.p();
//
以上的这种操作方式打印出来的也是
ABC
//
采用匿名内部类可以解决这个问题,结果就只有
A
了
A a =
new
A(){};
a.p();
}