黑马程序员技术交流社区

标题: 怎么区分方法是继承来的还是实现? [打印本页]

作者: せ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方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2