zoukankan      html  css  js  c++  java
  • JAVA中的抽象类与接口

    抽象类 abstract class

      包含抽象方法的类,叫抽象类。而抽象的概念就是抽象出共同属性:成员变量和方法。所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法。当然抽象方法是一定要有的。

      抽象类是用于单一继承的,不能实例化。而继承类一定要实现抽象方法,因为抽象方法在抽象类里是没有实现行为的,访问权限只能是public。而非抽象方法则可以赋予方法的默认行为,访问权限可以多种,但需要考虑非抽象方法是否需要被继承类访问。

    接口 interface

      接口,用于多重继承,也不能实例化。只能包含static final的成员变量,不过在interface中一般不定义成员变量。而成员方法在接口里只能是抽象方法,访问权限只能是public。

      所以,无论抽象类还是接口,抽象方法都需要在子类中实现,而且在子类中实现这些方法一个都不能少。而抽象类里面的非抽象方法,则在子类可以不重写实现里面的行为。

    案例1:

    package extendsPackage;
    
    public class Child extends Children implements Lover {
        public Child(String name) {
            super(name);
        }
    
        public void printName() {
            System.out.println(super.getName());
        }
    
        public void love(String name) {
            System.out.println(name + ", I love you!");
        }
    
        public static void main(String[] args) {
            Child boy = new Child("Charley");
            System.out.println(boy.getName());
            Child girl = new Child("Queenie");
            girl.printName();
            boy.love(girl.getName());
            girl.love(boy.getName());
        }
        /**
         * 输出结果为:
         *  Charley 
         *  Queenie 
         *  Queenie, I love you! 
         *  Charley, I love you!
         */
    }
    
    // 抽象类
    abstract class Children {
        private String name;
    
        public Children(String name) {
            this.name = name;
        }
    
        // private then Child obj can not access this method
        // private String getName() {
        public String getName() {
            return name;
        }
    
        abstract void printName();
    
    }
    
    // 接口
    interface Lover {
        void love(String name);
    }
    View Code

    抽象类和接口的应用

      那么究竟什么时候应用抽象类,什么时候应用接口呢?看了广泛流传的报警门例子,思考后得到的理解是:抽象类,"is a"的关系,抽象出共同的本质特征,单一继承;接口,"like a"的关系,个性化特征,多重继承。

      不同的门都具有本质特征动作 open(), close()。那么抽象类和接口都可以定义这两个方法。现在要求它具有报警alarm功能。

      1) 如果这3个功能都放在抽象类里面,那么所有的门都具备了这3个功能,但是有的门不需要报警功能;

      2) 如果这3个功能都放到接口里面,需要用到报警功能的其他类,就需要实现门的open和close功能,这样子也不对!

      所以,应该把门的open, close和alarm分离,让所有的门都有open, close动作,继承抽象类Door。而需要添加报警功能的门,则再继承接口Alarm。

    案例2:

    abstract class Door { 
      abstract void open(); 
      abstract void close(); 
    } 
     
    interface Alarm { 
      void alarm(); 
    } 
     
    class AlarmDoor extends Door implements Alarm { 
      void open() { … } 
      void close() { … } 
      void alarm() { … } 
    } 
    View Code

      可以看出,因为抽象类是用于单一继承,接口是用于多重继承,所以需要这样安排。而同时看到,抽象类就是类的本质特征,共同的;接口是个性化的,如果你想让类更具个性化,则需继承其他相应个性特征的接口。

    参考资料:

    http://android.blog.51cto.com/268543/385282

  • 相关阅读:
    2013年工作中用到的10个命令:11-20
    2013年工作中用到的10个命令:11-20
    2013年工作中用到的10个命令:1-10
    OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
    OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    Java实现 LeetCode 239 滑动窗口最大值
    Java实现 LeetCode 239 滑动窗口最大值
    Java实现 LeetCode 239 滑动窗口最大值
    Java实现 LeetCode 238 除自身以外数组的乘积
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3592495.html
Copyright © 2011-2022 走看看