把JAVA2参考大全的抽象类和接口相关章节看完后,实在找不出他们的不同,除了一个只能单继承,一个可以多继承。既然JAVA语言的结构设计很巧妙,那么存在这两个概念必然有其理由,谁能告诉我在什么情况下必取两者之一。我自己总结它们的一些特点,好像在这些方面书上的例子无法体现出非得用哪个:1。访问原则:两个都可以用public或者什么访问修饰符都不加,public的可以从任何地方访问,而默认是在一个包下。2。派生类必须实现抽象类的abstract方法或所有接口定义的方法,否则该类仍然是个抽象类,仍然不能实例化。3。无论是抽象类还是接口,都可以在里面定义int i = 0; 这样的变量,并可以在派生类中被使用。4。都可以实现多态,虽然不能实例化,但是可以建立抽象类或接口的引用,调用子类实现的方法时采用动态选择。5。抽象类中的抽象方法必须是非静态的,至于接口,我不知道是不是也有这个规定,不过我看过的所有例子没有哪个含有静态方法。6。在类中实现接口的方法,则必须将该方法声明为public类型。而abstract方法并没有指定非要是public的,可以不加修饰符。7。抽象类没有抽象构造函数,接口中根本没有构造函数。8。接口可以扩展的,就是 interface A extends B,B也是接口,则A包含了B的方法。而抽象类的继承也是这样。
以上不知道我说的对不?从我的观点来看,只要允许抽象类的多继承,好像接口能做的事抽象类就可以做了。因为抽象类所包含的东西毕竟多一些。我记得在用线程的时候需要实现接口的run方法,接口在很多应用很重要,不过我初学,还不理解,希望高手举例说明一下,在那种环境下抽象类根本无法完成接口的工作(多继承除外),也就是说,java语言这样的设计用意何在?

解决方案 »

  1.   

    不错,学习精神可嘉。不像那些啥也不懂就瞎问的水客。^_^,接下来说说我的看法,仅供参考。
    “在那种环境下抽象类根本无法完成接口的工作(多继承除外)”=====多重继承,这恰恰是抽象类和接口类存在的最最关键的原因。 多重继承,也是非常重要的编程思想。Java语言设计的用意就是源于此的。难道你觉得不值得?说说其他的方面,看了上面写的内容,你在认识这抽象类和接口上有些错误。
    抽象类是可以定义抽象的元素--抽象方法,也可以定义非抽象的元素--属性,方法等。
    接口是只可以定义抽象的元素--方法定义。静态变量也归于抽象的元素范畴。
    形象的说,就是接口才是百分百抽象的。所以,大体上说,抽象类更多用于定义事物模型。接口更多用于定义模型规则。基于此,多重继承就显得愈加重要咯。你上面写的内容,
    1,没看明白。
    2,大体上正确。接口的实现类必须实现接口中的所有方法,否则,根本不能编译。
    3,错了不是,final static int i = 0;常量才许可在接口中定义。
    4,对。
    5,错了。抽象类中当然可以定义静态方法,并且直接使用。接口就不可以了。
    6,对。
    7,对。构造函数是特殊的函数,不能继承过载的哦。更不能由其他类实现的哦。
    8,对。
      

  2.   

    从JAVA语法上看,你可以实现多个接口,但是不能继承多个抽象类。从面向对象的观点来看,接口是一个函数集合,抽象类代表了一种业务类别。
      

  3.   

    推荐楼主看一下java与模式中的相关章节。有一章是专门讲抽象类和接口的。
      

  4.   

    总结一下。确实要学习设计模式才能体会到JAVA语言的精妙。谢谢网友JohnWoo(JohnWoo)。对于你的总结,在接口中“final static int i = 0,常量才许可在接口中定义”这一条,我试了一个例子,发现确实要得是常量,一开始要初始化,但是不一定要加final static这些关键字。对于“抽象类中当然可以定义静态方法,并且直接使用。”是这样的。只是不能abstract和static连用。