抽象类和选择性实现接口

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.抽象类可以不用实现接口的全部方法

有的时候需要将接口和抽象类配合起来使用,这样可以为开发者提供相当的便利性,开发者觉得哪个方便就选用哪个。这样的抽象类称为便利类。此时,便利类并不需要实现接口的所有方法,可以留给继承它的子类去实现它们。
  这么做并非是没有意义的,当你自己写的类想用接口中个别方法的时候(注意不是所有的方法),那么你就可以用一个抽象类先实现这个接口(方法体中为空),然后再用你的类继承这个抽象类,这样就可以达到你的目的了,如果你直接用类实现接口,那是所有方法都必须实现的。
示例1

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!!");
          }
 }

示例2

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.附加:

抽象类不能被实例化,所以它没必要实现所有的方法;
一个类若只实现了接口的部分方法,那这个类就一定是一个抽象类;
抽象类可以实现接口的部分方法或者一个方法也不实现;


赠人玫瑰,手有余香。您的支持是我创作最大的动力!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 在准备面试的过程中发现接口和抽象类这两个概念,总结一下: 1.抽象类和接口联系和区别 1.1接口:接口就是一些特定...
    周小米同学阅读 2,685评论 0 1
  • 一、继承和多态在面向对象编程中,继承(也称为派生)让您能够创建新类,而这些类继承了父类(也称为基类)的特征和行为。...
    CarlDonitz阅读 844评论 0 2
  • 接口 从“面向接口编程”的角度看,接口是一中思想层面上的用以实现多态、提高软件灵活性和可维护行性的架构部件。 从代...
    小王子是偷影子的人阅读 525评论 0 2
  • 前言:不知不觉,Java基础知识我们就要学习抽象类与接口了,简单来说,概念上的东西不难,但是用处很大,灵活运用比较...
    古拉啦啦阅读 236评论 0 3
  • 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是...
    FrozenSunset阅读 506评论 0 3