`

abstract class 与 interface

 
阅读更多
1. 声明方法的存在而不去实现它的类被叫做抽象类,它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能抽象构造函数或抽象静态方法。
(2)abstract类的子类为它们的父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
(3)接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
(4)abstract class里可以有成员变量,可以有非抽象的方法,而interface中的成员变量必须是static,final的,而且没有非抽象的方法。
(5)有这样一个需求,要实现一个门的实例,可以有两种方法定义这个抽象概念:
   abstract class Door{
   abstract void open();
   abstract void close();
    }
   interface Door{
    void open();
    void close();
    }

完工。可老板看着不满意,又要再加个需求,说我要能报警的门,可以这样实现
 
 abstract class Door{
   abstract void open();
   abstract void close();
   abstract void alarm();
}
  interface Door{
  void open();
  void close();
}

似乎有点不对,是报警是门特有的属性吗,答案当然是否定的,这就违反了ISP(Interface Segregation Principle)接口隔离原则。我们可以将报警功能抽象为另外一个抽象类或者接口,不过由于Java不支持多继承的机制,只能用接口定义了:
   abstract class Door{
   abstract void open();
   abstract void close();
    }
  
   interface Door{
    void open();
    void close();

}
   interface Alarm{
   void alarm();

}

这样,具有报警功能的门就有两种方法实现了:
Class AlarmDoor extends Door implements Alarm{
  void open(){..};  
  void close(){..};  
  void alarm(){..};  
}

class AlarmDoor implements Door,Alarm{
 void open(){..};  
  void close(){..};  
  void alarm(){..};  
}

Java中继承表示“is a”的关系,接口表示“like a”的关系,弄清楚这两个关系,在我们定义抽象概念的时候就有所选择了。第一种方法表示,这是一个门,且有报警功能;第二种方法表示,这个对象既有门的特点,又有报警功能。
引用
这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。

引用
abstract class和interface是Java语言中的两种定义抽象概念的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。
分享到:
评论

相关推荐

    深入理解abstract class和interface

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...

    Java abstract class 与 interface对比

    主要介绍了 Java abstract class 与 interface对比的相关资料,需要的朋友可以参考下

    java abstract class interface之间的区别介绍

    java abstract class interface之间的区别介绍 java abstract class interface之间的区别介绍

    abstract class和interface有什么区别?

    25、JSP中动态INCLUDE与静态INCLUDE的区别?  动态INCLUDE用jsp:include动作实现 clude page="included.jsp" flush="true" / >它总是会检查所含文件中的变化,适合用于包含动 态页面,并且可以带参数。 静态...

    java中abstractclass和Interface.doc

    java中abstractclass和Interface.doc

    [转]深入理解abstract class和interface

    NULL 博文链接:https://fanlei77.iteye.com/blog/1453579

    interface&abstract class

    看到的一个讲interface&abstract class 的感觉不错。

    Java中抽象类和接口的区别与作用详解

    结论:abstract class和Interface是JAVA语言中的两种定义抽象类的方式。Interface将abstract的概念作了更进一步的发挥。你可以想像Interface是“纯粹”的 abstract class,只可以包含抽象方法,也包括一些常量的定义...

    Struct 、Class、Interface、Abstract区别与关系

    Struct 、Class、Interface、Abstract各个的特性、应用场景等对比

    亮剑.NET:.NET深入体验与实战精要清晰版及源码

     2.5 abstract class与interface  2.6 公共变量与属性的区别  2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别 ...

    亮剑.NET深入体验与实战精要.part1.

     2.5 abstract class与interface  2.6 公共变量与属性的区别  2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别 ...

    亮剑.NET深入体验与实战精要.part3

     2.5 abstract class与interface  2.6 公共变量与属性的区别  2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别 ...

    亮剑.NET深入体验与实战精要.part4(完)

     2.5 abstract class与interface  2.6 公共变量与属性的区别  2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别 ...

    亮剑.NET深入体验与实战精要.part2

     2.5 abstract class与interface  2.6 公共变量与属性的区别  2.7 参数修饰符params、out和ref的区别  2.8 值类型和引用类型的区别 . 2.9 结构与类的区别  2.10 dispose()和close()、finalize()的区别 ...

    Java中抽象类和接口的区别.zip_java interf

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    Java程序开发中abstract 和 interface的区别详解

    abstract class和interface在Java语言中都是用来进行抽象类。但是两者有什么区别呢,接下来小编给大家带来了abstract 和 interface的区别详解,感兴趣的朋友一起学习吧

    JAVA中抽象类与接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...

    Java中抽象类和接口的区别

    在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...

    abstract class

    abstract class 抽象类--不具体的类 1) 抽象方法,只有行为的概念,没有具体的行为实现。 2) 包含抽象方法的类,就一定是抽象类。 使用: abstract 关键字修饰,包含抽象方法。 如:平面图形一定可以计算面积。 ...

Global site tag (gtag.js) - Google Analytics