Learn Java for Android Development Second Edition 笔记(六)- Interface

Interface

Java里用interface关键字,引入一种没有具体实现的类型。

Declaring Interfaces

interface一般以大写字母开头,able单词结束,如下例子:

interface Drawable
{
int RED = 1; // For simplicity, integer constants are used. These constants are
int GREEN = 2; // not that descriptive, as you will see.
int BLUE = 3;
int BLACK = 4;
void draw(int color);
}

interface声明的几点注意事项:

  • 如果需要被别的package访问,interface前可以加public,否则默认只能被package内部的其他类访问。
  • interface前没有必要再加abstract,因为它实际上已经是abstract的了。
  • interface里面的成员变量的属性是public final static,没有必要再显示加上这三个属性。
  • interface里面的成员变量必须显示初始化。
  • interface里面的成员函数属性是public abstract,没有必要再显示加上这两个属性。
  • interface里面的成员函数不能声明为static的,因为interface里的成员函数都是instance method。
  • 没有成员的interface称为marker interface

Drawable接口声明了要做什么,但是没有定义怎么做。有实现了该接口的类去定义怎么做。

Implementing Interfaces

class Point implements Drawable
{
@Override
public void draw(int color)
{
System.out.println("Point drawn at " + toString() + " in color " + color);
}
}

上面实现接口要注意两个地方,一个是draw函数前要加上public,因为接口定义里上public,另外一个是加上@Override。

可以把一个对象的引用赋值给该对象里实现了的接口类型的变量,例如以下例子:

public static void main(String[] args)
{
Drawable[] drawables = new Drawable[] { new Point(10, 20), new Circle(10, 20, 30) };
for (int i = 0; i < drawables.length; i++)
drawables[i].draw(Drawable.RED);
}

以上方法也实现了多态。

一个对象如果实现了两种接口,那么对象转换成的这两种接口之见可以互相转换,如下例子:

public static void main(String[] args)
{
Drawable[] drawables = new Drawable[] { new Point(10, 20),
new Circle(10, 20, 30) };
for (int i = 0; i < drawables.length; i++)
drawables[i].draw(Drawable.RED);
Fillable[] fillables = new Fillable[drawables.length];
for (int i = 0; i < drawables.length; i++)
{
fillables[i] = (Fillable) drawables[i];
fillables[i].fill(Fillable.GREEN);
}
}

一个类如果同时实现多个接口,有可能会有命名冲突,例如两个接口里有相同名字和参数的函数。

Extending Interfaces

interface可以继承,例如以下例子:

interface Colors
{
int RED = 1;
int GREEN = 2;
int BLUE = 3;
int BLACK = 4;
}
interface Drawable extends Colors
{
void draw(int color);
}
interface Fillable extends Colors
{
void fill(int color);
}

Why Use Interfaces?

Java里面提供interface接口并不仅是因为没有提供多重继承的功能,而是更为重要地实现一个理念:将接口和实现分离,面向接口编程(接口可以由interface或abstract class实现)。

只要有可能,尽量在代码里指定接口而不是具体类,以便代码能自适应的变更,特别是使用Java的Collections框架时。

以下是一个不灵活的例子:

ArrayList<String> arrayList = new ArrayList<String>();
void dump(ArrayList<String> arrayList)
{
// suitable code to dump out the arrayList
}

上面例子中将ArrayList类具体到了很多地方,如果某天想要变换使用一种类型的List如LinkedList,那么就需要修改很多地方。以上例子可以改成依赖于接口而不是具体的实现类,例如:

List<String> list = new ArrayList<String>();
void dump(List<String> list)
{
// suitable code to dump out the list
}

改成以上方式后,如果要换用LinkedList,那么只需要修改一个地方就可以了。

Interface和Abstract Class的几点总结:

  • 这两个是Java提供的两种抽象类型,不能被直接实例化
  • Interface不依赖于任何类,可以有任何类来实现。
  • Abstract Class可以和Interface联合起来使用。

Learn Java for Android Development Second Edition 笔记(六)- Interface

时间: 2025-01-01 02:19:31

Learn Java for Android Development Second Edition 笔记(六)- Interface的相关文章

Learn Objectvie-C on the Mac 2nd Edition 笔记

Chapter 1Apple’s Cocoa (for OS X) 和 Cocoa Touch (for iOS) toolkits 都是用 Objective-C写的. Chapter 2 (1) .m 代表 “messages”的缩写 .m -> Object-C compiler .c -> C compiler .cpp -> C++ compiler (2)在 Objective-C中, #import 保证了每个头文件只被包含一次,如同c中的#ifdef头文件卫士的作用一样.

Android驱动开发读书笔记六

第六章 Linux 驱动的工作和访问方式是 Linux 的亮点之一,Linux 系统将每一个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中,由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与设备文件交换数据.介绍到如何在多种平台,使用多种方式测试Linux驱动.给出的实例是统计单词的个数,但是关键还在实现该算法的技术是Linux 驱动. (一).编写Linux驱动程序的步骤 1.建立Linux驱动骨架(装载和卸载Linux驱动)

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

Java for Android 基础笔记-数据类型

Java的基本数据类型 布尔类型 boolean true | false java是一个强类型的语言,与JS中的布尔类型的自由转换相比,JAVA的Boolean类型只有两种true和false,JS中相应的只可以自行转换. 字符类型 char 可以存储一个汉字,和其他语言非常类似不再赘述. 整型 byte, 占用一个字节 -128`-127 short 2字节 -2^15~2^15-1 int 4字节 -2^31~2^31-1 long 8字节  -2^63~2^63-1 整型常量默认为int

Android 网络编程 API笔记 - java.net 包相关 接口 api

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

; AutoHotkey全自动安装环境设置和测试JAVA+Eclipas+Android+JRE+JDK+SDK+ADT+Android模拟器+Android Virtual Device Manager+NDK+Studio+Doc+Help+Android Application Project编程调试windows环境[草稿版] DetectHiddenWindows,On SetTitl

; AutoHotkey全自动安装环境设置和测试JAVA+Eclipas+Android+JRE+JDK+SDK+ADT+Android模拟器+Android Virtual Device Manager+NDK+Studio+Doc+Help+Android Application Project编程调试windows环境[草稿版] DetectHiddenWindows,OnSetTitleMatchMode,2 ; 激活窗口并单击按钮IfWinExistActiveControlClick

android第四周作业笔记

第四周作业要求如下 .....看了一下作业要求后,然后做了几周后.....老师....你这是玩我是吧?!你绝壁在玩我?! 算了,多说无益,来看看我们江大婶的做法吧 首先是MainActivity.java package cn.edu.shu.cs.android.experiment04; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.Activity; import and

.Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用

下拉刷新很多地方都用到了,新浪微博,微信,百度新闻 这里我们使用一个开源的库叫:PullToRefresh 开源地址:https://github.com/chenyoca/pull-to-refresh 下载地址:https://github.com/chenyoca/pull-to-refresh/archive/master.zip 解压代码之后通过ecplise导入到项目里面 导入之后可能会出现库路径引用错误 在项目右键,依次对库进行修正 运行主Activity 这时就可以看到效果了!接

.Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译

apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运行过项目,在项目下的bin debug下就有同名apk文件了(Eclipse)下是这样的.在Android下变成了\app\build\apk下了 当然我们不能把这个apk放在商店.没有签名会被人家的apk替换 二.签名发布 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过