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

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

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

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

Java基础知识强化18:抽象类、接口的区别 和 选择性实现接口方法的更多相关文章

  1. Java基础知识强化89:Date类之Data类概述及其方法

    1. Date类概述 类Date表示特定的瞬间,精确到毫秒 2. 构造方法 public Date():根据当前默认毫秒值创建日期对象 public Date(long date):根据给定的毫秒值创 ...

  2. Java基础知识强化84:System类之exit()方法和currentTimeMillis()方法

    1. exit方法: public static void exit(int status): 终止当前正在运行的Java虚拟机.参数用作状态码:根据惯例,非0的状态码表示异常终止. 调用System ...

  3. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  4. Java基础知识强化104:Serializable接口 与 Parcelable接口

    1. 什么是 序列化 和 反序列化 ?     序列化 :序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序 ...

  5. Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)

    1. 简介 我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式 ...

  6. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  7. Java基础知识强化之多线程笔记01:多线程基础知识(详见Android(java)笔记61~76)

    1. 基础知识: Android(java)学习笔记61:多线程程序的引入    ~    Android(java)学习笔记76:多线程-定时器概述和使用 

  8. Java基础知识强化之集合框架笔记66:Map集合面试题之HashMap和Hashtable区别(重要)

    1. HashMap和Hashtable区别 ? • Hashtable:线程安全,效率低.不允许null键和null值 • HashMap:线程不安全,效率高.允许null键和null值 packa ...

  9. Java基础知识强化之集合框架笔记17:List集合的特有的遍历功能

    1. List集合的特有遍历功能: size()和 get()方法结合使用 2. 代码示例: package cn.itcast_03; import java.util.ArrayList; imp ...

随机推荐

  1. 入门5:PHP 语法基础——流程控制

    一.if...else 语句 if( ) else{ } 如果 .... 就.... 否则.... if(判断){ 判断成立 则执行该表达式 }else{ 如果上方判断都不成立 则执行该表达式 } i ...

  2. 新站如何做SEO及注意事项

    最近公司做了新网站,完成后运营优化的工作就落在我身上了,由于之前也没有.就去网上百度了一下,上了各种论坛查阅大牛的博客.自己也总结了一些要点,在这里和大家分享一下.新网站大家可以点击查看牛羊养殖在线. ...

  3. Xcode 5 解决 The operation couldn’t be completed. (NSURLErrorDomain error -1012.) 问题

    使用Xcode6.1 SVN 出现问题 The operation couldn’t be completed. (NSURLErrorDomain error -1012.) 解决方法: 打开终端 ...

  4. oracle 对象权限 系统权限 角色权限

    系统权限: 允许用户执行特定的数据库动作,如创建表.创建索引.连接实例等 对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列.执行存储过程等 select * from user_sys ...

  5. Unity3D批处理脚本

    Unity3D批处理脚本 本文属于转载,如有侵权,请留言,我会及时删除! Max09在模型到处的模型和U3D场景的尺寸不一致,Max09中的1m导到U3D中,只有0.01m,这时可以在U3D中将模型的 ...

  6. iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装

    一个简单的利用UIScrollView 实现的无线滚动banner,下面的代码实现,因为封装问题,对两个及一下的view 支持出了一点问题(view是传参进来的,不可以生成两份),但是原理是正确的,智 ...

  7. ReiserFS与EXT3的比较

    ReiserFS与EXT3的比较 最近,我刚从ReiserFS文件系统转到了ext3日志文件系统.我是一个ReiserFS的忠实追随者,并且直到现在我也没有改变我对该文件系统的看法.我之所以转而使用e ...

  8. jQuery Validate 验证,校验规则写在控件中的具体例子

    将校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></scrip ...

  9. android EditText监听事件及参数详解

    editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence ...

  10. [Java] Map / HashMap - 源代码学习笔记

    Map 1. 用于关联 key 和 value 的对象,其中 key 与 key 之间不能重复. 2. 是一个接口,用来代替 Java 早期版本中的 Dictionary 抽象类. 3. 提供三种不同 ...