zoukankan      html  css  js  c++  java
  • JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的.

    本文将从下面几个方面深入探讨一下Java 抽象类和接口

    一.抽象类语法及规范

    二.接口的语法及规范

    三.抽象类和接口的区别 ,将从语义细节及设计层面两方面来描述

    本文由本人查阅资料并结合自己理解所作,如果有理解不到位的地方,欢迎各位斧正.

    一.抽象类

      抽象类使用 abstract class 来定义,如果一个类使用abstract 来定义,那么这个类就是抽象类.

      语法如下:  

    abstract class className{}

      抽象类的设计就是用来被继承的,抽象类与普通类的区别如下:

      1.抽象类不能用来创建对象.

       如果一个类被定义为抽象类 如 public  class A{}, 使用 诸如 class A a = new A();等方法类试图创建一个A 对象,编译将会报错.

      2.抽象类的子类必须实现父类的抽象方法,否则这个子类也必须定义为抽象类

      3.抽象的方法不能定义为private,因为抽象方法必须被实现

         除了这两个方面,抽象类和普通的类的特性一致.

      特别说明:

         抽象类一般得有抽象方法,但这不是必须的.也就是一个抽象类里面的方法都可以是不抽象的.

         反过来,而如果一个类有抽象方法,那么这个类一定都是抽象类.

         另外:抽象类里面的抽象方法如果没有指定访问权限,那么为default 权限,即包内可见权限,并不是默认为public 权限,这个和普通类的机制一样的.

         这点需要特别注意,有人在博客里面说抽象方法的默认访问权限是pubulic,经过本人认证,这个是错误的.

    二.接口

     接口被声明为 interface ,语法如下:

    interface interfaceName{}

      接口是抽象的高度体现,有如下的特点:

      1.接口里的所有方面默认都是 public abstract的,也只能是public abstract 所以在接口里面定义方法,只需要定义方法名和返回类型即可.
       使用诸如  public int methodName{}  或者 public abstract  void methodName{} 类似的定义其实是多此一举.

       而试图用 protected 或者 private ,final ,static 等修饰接口中的方法,将会得到编译错误提示.

      2.接口里面也可以定义变量名,而他们默认将会是 public static  final 的,除了之外,变量名不予许使用其他的修饰名修饰.

       接口中 例如 private int a = 1; protected int b = 2 ;之类的语句将会提示编译错误.

       一般不在接口里面定义变量

      3.实现接口的类必须实现接口的所有方法,除非实现类也为抽象的.

      4. 不能使用new interfaceName 来创建接口对象。

    三. 抽象类和接口的区别

      1.语义细节上

        抽象类是从本质上来说,他还是一个类(class),除了上面的一些特殊约定外,他和具体类的约定一致.但是接口不是类( an interface is not a class),接口和抽象类语义不同如下:

        1) 抽象类里面可以有构造器.而接口不可以

        2) 抽象类里面可以具有非抽象的方法,而接口中的所有方法都是public abstract 的,接口中的所有方法都是抽象的.

        3) 抽象类里面可以定义各种访问权限的成员变量. 但如果在接口中定义成员变量,他们只能是 public final static 的.

        4) 抽象类可以定义静态代码块,而接口不可以

        5) 子类可以只能继承一个抽象类,但是接口的实现类可以实现多个接口

      2.设计理念选择

        1)抽象类体现的是对事物的抽象.它是对整个类的一种抽象,这种抽象可以包含行为,属性的抽象.但是接口是针对行为抽象.比如

         猫和狗都是动物,他们都具有一些共同的特征..所以可以抽象出一个Animal 的抽象类,猫和狗都是Animal 的子类. 他们都具有一些动物的共同特征.猴子也是Animal 的子类. 芒果树不属于动物,所以他不能继承Animal

         猫和猴子都可以爬树, 但是他们爬树的方式不太一样.爬树是一种行为的抽象.这时,就应该将爬定义为接口 Climb  .里面定义行为 climb(). 

         猫和猴子的爬树行为不一样,在各自实现Climb 接口,里面在实现各自的爬树 climb() 即可.而狗不具有爬树的行为,所以他不能实现爬树的接口.

         而如果将Climb 定义为抽象类,那么 猫和猴子就是 Climb 的子类了!显然不合适. 

        2)抽象类体现的是模板式设计的思想,子类自需继承父类即可以具有默认的行为,以后如果在父类增加一个新的非private或default 方法,他的子类会自动具有改新增的行为,子类代码不需要任何更改.

         而接口更多体现的一种规范,它是一种辐射式的设计思想.接口一旦发布,再修改的代价就会很大. 比如在如果接口里面增加一个新方法,它的所有实现类都必须增加这个方法的实现. 

         接口类似于系统里面的总纲.而抽象类类似与系统中的中间产品,他们定义了一些具体的行为,也有更多的抽象行为,他们不能作为最终产品发布。

        

      

      

  • 相关阅读:
    解决流氓软件的工具,做个记录
    目前使用较好的网盘搜索引擎
    网页截图分段保存
    国外统计学课程主页Statistical Books, Manuals and Journals
    notepad++ TextFX替代
    只用 4 个月打造机器学习必备技能,这位工程师成功翻转职涯人生
    时序差分学习
    来自NVIDIA开源的pix2pixHD,将Image-to-Image Translation带到了另一个境界
    关于HTML5,最牛逼的10本书!
    IDEA配置和插件
  • 原文地址:https://www.cnblogs.com/a2211009/p/4593169.html
Copyright © 2011-2022 走看看