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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马潘浩 中级黑马   /  2013-3-7 16:09  /  1696 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马潘浩 于 2013-3-10 11:04 编辑

接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类?

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9

查看全部评分

6 个回复

倒序浏览
本帖最后由 李洪因 于 2013-3-7 16:29 编辑

接口可以继承接口的:
接口和接口之间可以定义继承关系,并且接口之间允许实现多继承
  1. public class AnimalText {
  2. public static void main(String[] args) {
  3.   Animal a=new Dog();//实例化Dog
  4.   a.enjoy();
  5.   value v=new Dog();
  6.   v.valuable();
  7.   protect p=(protect)v;//对象转型
  8.   p.protectable();
  9.   
  10. }
  11. }
  12. abstract class Animal{ //定义一个抽象类Animal
  13. public abstract void enjoy() ;
  14. }
  15. interface protect{    //定义一个接口
  16. public void protectable();
  17. }
  18. interface value{
  19. public void valuable();
  20. }
  21. <FONT color=red>interface hen extends value{ //定义一个继承hen的接口(实现接口对接口)
  22. </FONT>public void print();
  23. }
  24. class Dog extends Animal implements protect,value{//通过实现多继承

  25. @Override
  26. public void valuable() {  // 实现接口
  27.   System.out.print("50元");
  28.   
  29. }

  30. @Override
  31. public void protectable() {// 实现接口
  32.   System.out.print("不受保护");
  33.   
  34. }
  35. public void enjoy(){        //重写抽象方法
  36.   System.out.print("动物");
  37. }

  38. }
  39. class Hen implements hen{//实现接口对接口
  40. public void print(){
  41.   System.out.print("好吃");
  42. }
  43. public void valuable(){
  44.   System.out.print("11");
  45. }
  46. }

复制代码
接口和抽象类中的所有抽象方法不能有具体实现,而应在它们的子类中实现所有的抽象方法(要有函数体,哪怕{ }里是空的),java的设计者可能为抽象方法的灵活性考虑,每个子类可根据自己的需要来实现抽象方法。


其实接口是抽象类的变体。一般来说不会用抽象类去实现接口。因为能够定义在接口中的方法,一样能写在抽象类里,所以为什么需要去实现呢。但作为一个类,即使是抽象的,一旦实现了接口,就必要实现接口中的所有方法。但同时也要确保抽象类中存在抽象方法。

抽象类可以可继承实体类, 抽象类可以有一个实体的父类

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 不错

查看全部评分

回复 使用道具 举报
恩很好
我再补充一下下
有抽象方法的是抽象类
抽象类中 可以没有抽象方法(也就是说抽象类中的方法都实现了),这样可以避免创建对象
回复 使用道具 举报
除了最后一个其他的都是可以的
回复 使用道具 举报
抽象类都是父类了,哪还有父类给他继承啊
回复 使用道具 举报
第一:抽象类是否可继承实体类?
答:抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数

其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。

关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。

一般学习者会写的简单试验代码:

class A{}
abstract class B extends A{}

结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。

这个问题涉及到两个个基础知识:
1.
所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。
2.
所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。


所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是
class A{
public A(){}

}

B继承 A 的时候,则是
abstract class B extends A{
public B(){
super();
}
}


第二:接口是否可继承接口?

答:接口与接口之间存在多继承看代码,为什么能多继承因为接口都没方法体所以可以随便用无所谓

interface A
{
        void methodA();
}
interface B
{
        void methodB();
}

interface C extends B,A
{
        void methodC();
}

class D implements C
{
        public void methodA(){}
        public void methodC(){}
        public void methodB(){}
}



第三:.抽象类可以实现接口..比如java.util中的AbstractCollection类就是实现的Collection接口

接口是一个特殊的抽象类,这个抽象类所有的方法都是抽象方法。抽象方法不可以实现。
一个抽象类对抽象方法可有可无,实体方法也可有可无。
抽象类可以继承接口,可以定义接口中的方法为实体方法时就可以实现了。定义为抽象方法的话就需要子类实现,和接口类似。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 很详细,不错

查看全部评分

回复 使用道具 举报
0.00 发表于 2013-3-7 23:43
抽象类都是父类了,哪还有父类给他继承啊

所有没有父类的类 都继承了 Object  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马