• java中抽象类与接口的区别


    转自:

    http://blog.csdn.net/tp7309/article/details/10452445

    二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下。

    抽象类 abstract class
        包含抽象方法的类,叫抽象类。而抽象的概念就是抽象出共同属性:成员变量和方法。所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法。当然抽象方法是一定要有的
        抽象类是用于单一继承的,不能实例化。而继承类一定要实现抽象方法,因为抽象方法在抽象类里是没有实现行为的,访问权限只能是public。而非抽象方法则可以赋予方法的默认行为,访问权限可以多种,但需要考虑非抽象方法是否需要被继承类访问。
    接口 interface
        接口,用于多重继承,也不能实例化只能包含static final的成员变量,不过在interface中一般不定义成员变量。而成员方法在接口里只能是抽象方法,访问权限只能是public
     
    -----------------
    所以,无论抽象类还是接口,抽象方法都需要在子类中实现,而且在子类中实现这些方法一个都不能少。而抽象类里面的非抽象方法,则在子类可以不重写实现里面的行为。参考以下例子:
    1. public class Child extends Children implements Lover{ 
    2.     public Child(String name) { 
    3.         super(name); 
    4.     } 
    5.  
    6.     public void printName() { 
    7.         System.out.println(super.getName()); 
    8.     } 
    9.  
    10.     public void love(String name) { 
    11.         System.out.println(name + ", I love you!"); 
    12.     } 
    13.  
    14.     public static void main(String[] args) { 
    15.         Child boy = new Child("Charley"); 
    16.         System.out.println(boy.getName()); 
    17.  
    18.         Child girl = new Child("Queenie"); 
    19.         girl.printName(); 
    20.  
    21.         boy.love(girl.getName()); 
    22.         girl.love(boy.getName()); 
    23.     } 
    24.  
    25. abstract class Children { 
    26.     private String name; 
    27.  
    28.     public Children(String name) { 
    29.         this.name = name; 
    30.     } 
    31.  
    32.     //private then Child obj can not access this method 
    33.     //private String getName() { 
    34.     public String getName() { 
    35.         return name; 
    36.     } 
    37.  
    38.     abstract void printName(); 
    39.  
    40.     //haha()在子类中没有被实现 
    41.     //abstract void haha(); 
    42.  
    43. interface Lover{ 
    44.     void love(String name); 
    抽象类和接口的应用
    我看了thinking in java里面的内容,感觉似乎用抽象类或者接口实现的效果都差不多,没看出什么特别。那么究竟什么时候应用抽象类,什么时候应用接口呢?看了广泛流传的报警门例子,思考后得到的理解是:抽象类,"is a"关系,抽象出共同的本质特征,单一继承;接口,"like a"关系,个性化特征,多重继承。
     
    不同的门都具有本质特征动作 open(), close()。那么抽象类和接口都可以定义这两个方法。现在要求它具有报警alarm功能。
    1) 如果这3个功能都放在抽象类里面,那么所有的门都具备了这3个功能,无疑不妥,有的门不需要报警功能啊!
    2) 如果这3个功能都放到接口里面,需要用到报警功能的其他类,就需要实现门的open和close功能,这样子也不对!
     
    所以,应该把门的open, close和alarm分离,让所有的门都有open, close动作,继承抽象类Door。而需要添加报警功能的门,则再继承接口Alarm。
    1. abstract class Door { 
    2.   abstract void open(); 
    3.   abstract void close(); 
    4.  
    5. interface Alarm { 
    6.   void alarm(); 
    7.  
    8. class AlarmDoor extends Door implements Alarm { 
    9.   void open() { … } 
    10.   void close() { … } 
    11.   void alarm() { … } 
     
    可以看出,因为抽象类是用于单一继承,接口是用于多重继承,所以需要这样安排。而同时看到,抽象类就是类的本质特征,共同的;接口是个性化的,你想让类更具个性化,则继承其他相应个性特征的接口。
  • 相关阅读:
    Anaconda和Miniconda的安装
    并联谐振电路频率阻抗及计算曲线带宽案例摘要
    TEM波
    Android Studio实现简单考试应用程序
    android studio实现简单考试应用程序
    Android Studio的简易计算器界面设计
    时谐变换
    简要理解什么是趋肤效应
    c盘清理
    如何把Visual Studio完全安装在其他磁盘
  • 原文地址:https://www.cnblogs.com/hansonzhe/p/3704145.html
Copyright © 2020-2023  润新知