A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一个类A继承某抽象类B并且实现了接口C 类B中有一个抽象方法test();接口C中有一个方法test();实例A后调用test方法 怎么区分调用的是父类还是接口的?

4 个回复

倒序浏览
可以通过编译验证一下,结论是接口的。
代码:
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访问类型,说明是实现的接口中的方法
    {

    }
}

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
你在重写继承抽象父类和接口的方法实现中,加一句s.o.p打印一句话不就知道掉用的那个方法了!根据输出的语句来判断就行了,在思考一下,问题就能解决了!

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 老毕的sop经典。

查看全部评分

回复 使用道具 举报
反射就能搞定吧!!!
回复 使用道具 举报
我的测试结果是父类和接口共用同一个方法。代码如下:
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方法。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马