• Java基础知识强化18:抽象类、接口的区别 和 选择性实现接口方法


    1.抽象类和接口的区别

      抽象类里面可以有非抽象的方法(可以没有抽象方法),接口里只能有抽象方法

      抽象类中的抽象方法声明时不能有大括号,而接口中的所有方法都没有大括号
     
     抽象类(abstract class):

      a.抽象类是仅供派生的类,无法实例化一个抽象类,只能实例化从它派生的类

      b.抽象类的主要特征在于它包含抽象成员(abstract member),抽象成员是不具有实现的一个方法或属性,其作用是强制所有派生类提供实现

      c.由于抽象成员应当是要被重写(override)的,因此这类成员会自动成为virtual成员,而且不能这样显示地声明。

      d.抽象成员不能是private的,否则派生类看不见他们。

          e.抽象类只能继承一个类,实现多个接口。

     
    2.接口(interface):

      a. 接口是抽象类的变体

      b. 接口的一个关键特征是它既不包含实现,也不包含数据。

      c. 字段(也就是数据)不能出现在一个接口中,如果一个接口要求派生类包含特定的数据,那么它会使用属性而不是字段。由于属性不会包含任何实现作为接口声明的一部分,所以他不会引用一个支持字段。

      d. 接口的宗旨是定义由多个类共同遵守的一个契约,所以接口中所有成员都必须为public类型。

          e. 接口的成员变量声明为public static final;接口的成员方法声明为public abstract

          f. 接口可以多继承

    3.抽象类可以不用实现接口的全部方法

      有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。

      这么做并非是没有意义的,当你自己写的类想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用一个抽象类先实现这个接口(方法体中为空),然后再用你的类继承这个抽象类,这样就可以达到你的目的了,如果你直接用类实现接口,那是所有方法都必须实现的。

    e.g1:

    interface ITest { 
              void test1(); 
              void test2();
    }
    public abstract class Test implements ITest {
    //抽象类不用全部实现接口中的所有方法 
             public void test1() { 
                  System.out.println("test1!!");
              }
     }
    
    class TestChild extends Test { 
    //上面接口ITest 中剩余的方法test2,在该抽象类Test 的子类TestChild 去实现即可。 
              public void test2() { 
                  System.out.println("test2!!");
              }
     }

    e.g2:

    interface ITest { 
              void test1(); 
              void test2();
              void test3();
    }
    public abstract class Test implements ITest {
    //抽象类实现那些不想实现的接口方法,实现体为空
             public void test1() { }
             public void test2() { }
    
     }
    
    class TestChild extends Test { 
    //抽象类Test的子类去实现我们想要的实现的接口方法 
              public void test3() { 
                  System.out.println("test3!!");
              }
     }

    4. 不使用抽象类,选择性实现接口方法,如下:

    (1)问题描述:

     在对ObjectAnimator添加监听器的时候,需要实现一下四个方法才可以。

    animation = ObjectAnimator.ofFloat(imageView,"alpha",1f,0f);
    animation.setDuration(4000);
    animation.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
        }
        @Override
        public void onAnimationEnd(Animator animation) {
        }
        @Override
        public void onAnimationCancel(Animator animation) {
        }
        @Override
        public void onAnimationRepeat(Animator animation) {
        }
    });

     但是很多情况下我们并不需要对使用全部的四个方法,从而造成了代码上的冗余,但是不实现却不符合语法规则,那么有什么办法可以避免这种冗余的写法呢?

     (2)问题解决:

    引入这样的一种写法就可以了:

    /**
    *   AnimatorListenerAdapter.java
    */
    public class AnimatorListenerAdapter implements Animator.AnimatorListener{
        @Override
        public void onAnimationCancel(Animator animation) {
    
        }
    
        @Override
        public void onAnimationEnd(Animator animation) {
    
        }
    
        @Override
        public void onAnimationRepeat(Animator animation) {
    
        }
    
        @Override
        public void onAnimationStart(Animator animation) {
    
        }
    }
    /**
    *   MainActivity.java
    */
    animator.addListener(new AnimatorListenerAdapter(){
        @Override
        public void onAnimationStart(Animator animation) {
            super.onAnimationStart(animation);
        }
    });

    这样就可以了。这种写法对所有包含较多方法的接口非常适用。

    5.附加:

    抽象类不能被实例化,所以它没必要实现所有的方法

    一个类若只实现了接口的部分方法,那这个类就一定是一个抽象类

    抽象类可以实现接口的部分方法或者一个方法也不实现

  • 相关阅读:
    Vim的行号、语法显示等设置,即.vimrc文件的配置
    Vim 配置详解
    经典SQL语句大全
    几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比
    GHOST XP SP3无法安装IIS服务的解决方法
    开发中巧用Enum枚举类型
    代码的坏味道
    C#转义字符
    Dijit、ExtJS、jQuery UI 异同浅析
    未雨绸缪 Plan to Throw One Away
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4787951.html
Copyright © 2020-2023  润新知