标题: 怎么区分方法是继承来的还是实现? [打印本页] 作者: せR3n、何必装纯 时间: 2011-11-13 22:49 标题: 怎么区分方法是继承来的还是实现? 一个类A继承某抽象类B并且实现了接口C 类B中有一个抽象方法test();接口C中有一个方法test();实例A后调用test方法 怎么区分调用的是父类还是接口的?作者: 阮金明 时间: 2011-11-14 17:13
可以通过编译验证一下,结论是接口的。
代码:
abstract class B
{
abstract void func(); // 访问类型是default类型
}
interface C
{
void func(); // 接口中的方法默认是public abstract 方法
}
class A extends B
{
void func() // OK.继承抽象类的访问类型(当然还可以是public,protected)
{
}
}
class A extends B implements C
{
void func() // 编译错误,必须是public访问类型,说明是实现的接口中的方法
{
}
} 作者: 胡文杰 时间: 2011-11-14 17:22
你在重写继承抽象父类和接口的方法实现中,加一句s.o.p打印一句话不就知道掉用的那个方法了!根据输出的语句来判断就行了,在思考一下,问题就能解决了!作者: 魏兴发 时间: 2011-11-14 17:41
反射就能搞定吧!!!作者: fly51888 时间: 2011-11-14 18:58
我的测试结果是父类和接口共用同一个方法。代码如下:
public class A extends B implements C {
public static void main(String[] args) throws Exception, NoSuchMethodException{
A a= new A();
B b = new A();
C c = new A();
b.test();
c.test();
c.test2();
}
@Override
public void test() {
System.out.println("test");
}
@Override
public void test2() {
System.out.println("test2");
}
}
由于父类变量可以指向子类对象,所以
B b = new A(); C c = new A();是允许的。
假设子类A只是覆盖父类B中的test(),则变量c肯定访问不到test();对于子A类覆盖接口C,道理也是一样。但以上代码都能访问到test()方法。
我又在接口C中加了一个test2()方法。通过以上方式,c可以访问到test2()方法,但b访问不到test2()。所以由此推断子类A既重写了父类B
的test()的方法,也重写了接口C的test方法。