黑马程序员技术交流社区

标题: 关于抽象类中子父类中方法覆盖的问题 [打印本页]

作者: 潘星    时间: 2012-8-11 00:38
标题: 关于抽象类中子父类中方法覆盖的问题
interface Inter //定义了一个接口
{
         void show1(); //2个抽象方法
         void show2();
}
abstract class Demo //定义了一个抽象类
{
        abstract void run1();//2个抽象方法
        abstract void run2();
}
class Test  extends Demo implements Inter  //用一个类去继承了抽象类Demo,实现了一个接口
{
        void show1(){}  //覆盖接口中的2个方法
           void show2(){}
        void run1(){}  //覆盖了抽象类中的2个方法
        void run2(){}
}
问题一:为什么覆盖接口中的方法提示编译失败,权限不够大,而覆盖父类中的方法也没加public为什么
能编译通过?
问题2:为什么接口中的方法或者父类中的抽象方法一定要全部覆盖才能编译通过,原理是什么?
作者: 杨文宇    时间: 2012-8-11 00:48
本帖最后由 杨文宇 于 2012-8-11 00:55 编辑

1.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

所以,这样子就不会有错了
public void show1(){}  //覆盖接口中的2个方法
  public void show2(){}


2.
可以不实现,前提是子类的也要声明为abstract。
接口可以说是抽象类的特例


因为abstract方法所在的类也是一个abstract类,
而abstract方法是没有实现的,即没有方法体,当然就无法使用.
要使用这个方法,就必须实例化这个方法所在的类的对象,
通过类的对象调用方法,
而abstract类又是无法被实例化(new)的
故而必须要有一个类来继承这个abstract类

这个继承abstract的子类中要实现这个abstract方法,才能被实例化
否则不能实例化,子类还要声明为abstract
如果没有一个继承了abstract类的子类实现了它
,那么abstract的存在就没有意义了
其意义就是要被继承,被子类实例化来使用其内部的方法.

作者: 杜佳瑞    时间: 2012-8-11 00:58
本帖最后由 杜佳瑞 于 2012-8-11 01:00 编辑

问题一:为什么覆盖接口中的方法提示编译失败,权限不够大,而覆盖父类中的方法也没加public为什么
能编译通过?
接口中的方法定义必须是public abstract类型,这是格式。如果不定义成public,如果保证外部能调用它,实现它呢?
问题2:为什么接口中的方法或者父类中的抽象方法一定要全部覆盖才能编译通过,原理是什么?
这句话你理解的不对,实现接口或继承父类不一定要全部覆盖方法的,这里为什么必须覆盖呢?因为Inter这个类不是抽象的,所以子类Test继承了也不可能是抽象的,它又实现了Demo接口,那么就必须保证把接口内的所有抽象方法全部覆盖。这里有一个隐含的限制,所以楼主不要理解错了。
举个例子就明白了,为什么接口能继承呢?继承后不还是接口吗?





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