一。抽象类

有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它能被实例化。例如:有一个父类“水果(Fruit)”,它有几个子类“苹果(Apple)”、“橘子(Orange)”、“香蕉(Banana)”等。水果在这里仅仅只是作为一个分类,显然水果的实例没有什么意义(就好像一个人如果告诉你他买了一些水果但是却不告诉你是苹果还是橘子,你很难想象他到底买的是什么。)。而水果类又要能被子类化,这就要求我们使用抽象类(abstract class)来解决这个问题。
在java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。例如:
          定义抽象类水果(Fruit)
          public abstract class Fruit {
                  ……
          }
           如果我们试图用以下语句来获得一个实例,将无法编译成功。
           Fruit fruit = new Fruit();
而我们仍然可以构造水果类的子类,如:
          子类“苹果(Apple)”
           public class Apple extends Fruit {
                   ……
           }
          子类“橘子(Orange)”
           public class Orange extends Fruit {
                   ……
           }
这样就达到我们的目的了。
抽象类除了能象普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。例如:
           抽象类“形状(Shape)”拥有抽象方法draw()。
           public abstract class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。例如方法draw()对于类Shape没有意义,而类Shape的子类矩形(Rectangle)的方法draw()可以有实际的动作(根据矩形的四个顶点画出矩形的四个边),子类圆(Circle)的方法draw()也可以有实际的动作(根据圆心和半径画出圆周)。
抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那这个类只能定义为抽象类。
           如果按照以下代码类“形状(Shape)”仍然拥有抽象方法draw(),但没有定义为抽象类,将会编译失败。
           public class Shape {
                  ……
                  public abstract void draw();
                  ……
           }
抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。

二 接口

下面谈谈接口(interface)。java语言使用关键字interface定义一个接口。接口也是抽象对象,它甚至比抽象类更抽象。接口中的方法都是抽象方法。
一个接口可以继承其他接口;一个类通过关键字implements声明要实现一个接口,并具体实现接口的方法。
           例如:有一个接口InterfaceA,

Java代码
public   interface  InterfaceA {   
         void  methodA();   
}  
 
           类ClassA实现接口InterfaceA。

Java代码
public   class  ClassA  implements InterfaceA {   
          public   void  methodA() {   
               System.out.println( "methodA of ClassA implements InterfaceA" );   
         }   
}  
 
如果是抽象类实现一个接口,那么抽象类中可以不具体实现接口的方法(保持其抽象性),而由其子类去实现。
           抽象类ClassB实现接口InterfaceA,但是没有具体实现方法methodA(),

Java代码
public   abstract   class  ClassBS  implements InterfaceA{           }  
 
           子类ClassBSub实现接口InterfaceA,但是没有具体实现方法methodA(),

Java代码
public   class  ClassBSub implements InterfaceA{   
         public   void  methodA() {   
              System.out.println( "methodA of ClassBSub the subclass of ClassB" );   
        }   
}

接口和抽象类显著的共同点是接口和抽象类都可以有抽象方法。
接口和抽象类的不同点有:
           (1)抽象类可以有实例变量,而接口不能拥有实例变量,接口中的变量都是静态(static)的常量(final)。
           (2)抽象类可以有非抽象方法,而接口只能有抽象方法。

java允许一个接口继承多个父接口,也允许一个类实现多个接口,而这样的多继承有上面提到的缺点马?
答案是没有,这是由接口的抽象性决定的。
正如前面介绍的,在接口中不能有实例变量,只能有静态的常量,不能有具体的方法(包含方法体),只能有抽象方法,因此也就摒弃了多继承的缺点。
对于一个类实现多个接口的情况,因为接口只有抽象方法,具体方法只能由实现接口的类实现,在调用的时候始终只会调用实现类的方法(不存在歧义),因此不存在多继承的第二个缺点;而又因为接口只有静态的常量,但是由于静态变量是在编译期决定调用关系的,即使存在一定的冲突也会在编译时提示出错;而引用静态变量一般直接使用类名或接口名,从而避免产生歧义,因此也不存在多继承的第一个缺点。
对于一个接口继承多个父接口的情况也一样不存在这些缺点。
请看以下示例。
            接口A:

Java代码
public   interface  InterfaceA {   
         int  len =  1 ;   
         void  output();   
}  
 
            接口B:

Java代码
public   interface  InterfaceB {   
           int  len =  2 ;   
           void  output();   
}  
 
            接口InterfaceSub继承接口A和接口B:

Java代码
public   interface  InterfaceSub  extends  InterfaceA, interfaceB {            }  
 
            类Xyz实现接口InterfaceSub:

Java代码
public   class  Xyz  implements  InterfaceSub {   
         public   void  output() {   
                System.out.println( "output in class Xyz." );   
        }   
          public   void  outputLen( int  type) {   
                  switch (type) {   
                          case  InterfaceA.len:   
                                 System.out.println( "len of InterfaceA=." +type);   
                                  break ;   
                          case  InterfaceB.len:   
                                 System.out.println( "len of InterfaceB=." +type);   
                                  break ;   
                 }   
        }   
        public   static   void  main(String[] args) {   
               Xyz xyz=  new  Xyz ();   
               xyz .output();   
               xyz .outputLen();   
       }

以上代码不存在什么问题,但是如果试图编写以下存在冲突的代码,则会编译失败。

Java代码
Xyz xyz =  new  Xyz();   
int  len = xyz.len;   
System.out.println(len);

java 接口 实现和继承关系相关推荐

  1. java 接口可以多继承

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 接口是常量值和方法定义的集合.接口是一种特殊的抽象类. java类是单继承的.classB Exte ...

  2. Java 10 常用集合继承关系图

    概述 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用. 类图如下: 1.Iterable与Iterator接口之间的区别 我看到好多网上的文章类图 ...

  3. java接口中多继承的问题

    java中支撑多继承吗? 支持->接口啊 为什么接口支持多继承呢?因为接口中没有方法体!即使可能两个接口中有一样的抽象方法,但是 只会调用子类中覆盖该同样抽象方法的具体方法!不会引起调用的歧义! ...

  4. Java接口的多继承

    学习目标: Java中不支持继承过个类,但是可以继承多个接口: 当多继承接口时,接口中的方法怎么具体实现,以及如何区分方法属于不同的接口. 学习内容: 1. 类继承多个接口,且接口中的方法不一样 pu ...

  5. java语言类间继承关系是,Java语言类间的继承关系是(    )。

    Java语言类间的继承关系是(    ). 更多相关问题 [判断题] 持有OPEN票的游客不需要机票的确认,可直接按票面时间去机场乘坐飞机.() [填空题] 导游服务性质是().().().().() ...

  6. Java接口之间的继承

    /*** Created by xfyou on 2016/11/3.* 多接口之间的继承*/ public class HorrorShow {static void u(Monster b) {b ...

  7. java用关键字 指明继承关系_【填空题】java中用关键字 指明继承关系、用关键字 指明接口实现。...

    [单选] 台湾茶艺是属于中华茶文化的一个流派,它的基本精神是(). [单选] 青茶的品质特征是(). [问答题] 为防止蝶阀在全关时阀芯与密封圈卡死,盖米定位器应怎样设置? [判断题] 茶艺师与宾客对 ...

  8. java中类间的继承关系是_在Java程序里类之间的继承关系只能是__________。

    摘要: 比同跨拱式径的桥与桥相梁式,序里小很多其()要.中央工时带施分隔,关系关于工说层施误的防水法错是(.不正下面确的说法是(,序里标高行道致时高一计硬当设处标与车路肩连接.... 比同跨拱式径的桥 ...

  9. Java 接口的定义、接口的成语、接口的实现、接口与类的多继承、JDK1.8后新增方法、使用接口的注意事项

    什么是接口? 接口是更加彻底的抽象,在JDK 1.8之前接口中只能是抽象方法和常量. 接口体现的是规范思想,实现接口的子类必须重写完接口的全部抽象方法. 接口的基本定义格式: 修饰符 interfac ...

最新文章

  1. (C++)A+B 输入输出练习VI 每行的第一个数N,表示本行后面有N个数。
  2. java面向对象特征及阐述,Java面向对象四个特征
  3. 【智驾深谈】自动驾驶潜在突破点:传感器与车载集成系统(万字干货)
  4. Volatile缓存可见性实现原理(JMM数据原子操作具体步骤)
  5. 大学生创业交流会计算机二级,我校召开第三届“互联网+”大学生创新创业大赛选题交流讨论会...
  6. php strstr 从尾部,PHP strstr() 和 strrchr() 详解
  7. Transform(HDU-5637)
  8. 【Python】基础总结
  9. HTML5自定义数据属性data-*
  10. oracle分布式事物锁,ORA-02049:超时:分布式事务处理等待锁诊断-Oracle
  11. string字符串的查找替换、模式匹配
  12. S2A哨兵数据的波段合成、镶嵌、TOA(大气表观反射率)和裁剪的操作
  13. 脚本小子福利:安卓远控木马直接生成
  14. 数据挖掘中特征选择算法的基本综述
  15. 实力推荐:现网全能屏幕录像和编辑的软件
  16. STM32官方编程IDE及烧录软件介绍
  17. 利用官方预训练模型快速计算Inception Score和FID
  18. 关闭Postman v5.0自动更新
  19. 用Python实现小黑屋游戏
  20. 实训4——RFID刷卡开锁

热门文章

  1. 立即终止Sleep的线程
  2. Java中Dom解析XML
  3. 约束理论学习随笔(2)---DBR系统
  4. Android L 使用ART能提高多少性能?
  5. MMU和cache学习
  6. Deepmind顺练了人工智能14天成为星海2最强玩家
  7. 借助LDA主题分析的短文本相似性计算 - 综述帖
  8. TCP/IP 某些最常见的错误原因码 (errno)列表
  9. Swift开发iOS项目实战视频教程(一)---iOS真简单
  10. JavaScript时间日期格式转化