Java学习笔记之接口
一、接口的概念与定义
首先考虑一个简单的接口的定义:
public interface Output
{
int MAX_LINE = 40;
void out();
void getData(String msg);
}
- 定义接口使用关键字interface
- 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口
- 接口不可以有构造方法(区别于类中的构造方法)
- 接口里面的所有成员,包括常量、方法等都是public访问权限,所以在定义接口里面的成员时,可以省略访问控制修饰符,非要修饰一下子,也只能用public
- 接口里面的属性(即成员变量)只能是常量,而且全部具有public, static, final三种性质,因此,在接口里面,如下两行语句完全等价:
int MAX_LINE = 40;
public static final int MAX_LINE = 40;
- 接口里面的方法只能是抽象方法,即只声明一下函数类型,名称和参数列表,但是不可以提供具体实现
二、接口的继承
考虑如下代码:
interface A
{
int PROP_A = 5;
void testA();
}
interface B
{
int PROP_B = 6;
void testB();
}
interface C extends A, B
{
int PROP_C = 7;
void testC();
} public class myJavaTest
{
public static void main(String[] args)
{
System.out.println(C.PROP_A);
System.out.println(C.PROP_B);
System.out.println(C.PROP_C); }
}
输出:
5
6
7
- 接口的继承和类的继承不一样,接口支持多继承,多个父接口排在extends关键字之后,多个父接口之间用逗号隔开,如上面11行所示,子接口C继承了父接口A和B
- 子接口继承类父接口之后,可以获得它们的成员常量的访问权限。如21 -23行通过子接口C可以访问父接口A,B的成员常量PROP_A和PROP_B
三、接口的实现和定义
考虑如下程序:
interface Output
{
int MAX_LINE = 4;
void out();
void getData(String msg);
} interface Product
{
int getProductTime();
} //实现简单的打印作业
public class Printer implements Output, Product
{
private String[] printData = new String[MAX_LINE];
private int dataNum = 0; // 记录需要打印的作业数 public void out()
{
while (dataNum > 0)
{
System.out.println("打印机打印" + printData[0]); //把作业队列整体前移一位,并将剩下的作业数减1
System.arraycopy(printData, 1, printData, 0, --dataNum);
} } @Override
public int getProductTime() {
// TODO Auto-generated method stub
return 45;
} @Override
public void getData(String msg)
{
if (dataNum >= MAX_LINE)
{
System.out.println("输出队列已满,添加失败");
}
else
{
//把打印数据添加到队列里,作业数加1
printData[dataNum++] = msg;
}
}
public static void main(String[] args)
{
//创建一个Printer对象,当成Output使用
Output O = new Printer();
O.getData("123");
O.getData("456");
O.getData("789");
O.getData("ABC");
O.getData("def");
O.out();
//创建一个Printer对象,当成Product使用
Product P = new Printer();
System.out.println(P.getProductTime());
}
}
输出:
输出队列已满,添加失败
打印机打印123
打印机打印456
打印机打印789
打印机打印ABC
45
- 接口不能用于实例化,但是接口可以声明引用类型的变量,如53行,接口Output声明了一个引用变量O的类型是Output,61行,接口Product声明了一个引用变量P的类型是Product.
- 接口的实现需要用类,通常形式如下:
[修饰符] class 类名 extends 父类 implements 接口1, 接口2..
{
类体部分
}implements是表明这个类实现接口的关键字,一个类可以实现多个接口,多个接口之间用逗号隔开,如上述程序14行所示
- 一个类可以继承一个父类,并同时实现多个接口,此时,implements部分必须放在extends部分之后
- 一个类声明实现一个或者多个接口之后,则这个类必须完全实现这些接口里所定义的全部抽象方法(抽象方法就是那些只声明而没有实现的方法);否则该类将保留从父接口那里继承的抽象方法,于是该类也必须定义成抽象类。
上述程序用类Printer实现了Output接口和Product接口,于是,Printer对象既可以赋给Output变量(53行)也可以赋给Product变量(61行),好像Printer类既是Output类的子类,也是Product类的子类,这就是传说中的Java的模拟多继承。
Java学习笔记之接口的更多相关文章
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
- 1)Java学习笔记:接口和抽象类的异同
Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...
- Java学习笔记之——接口
接口(interface)和抽象类 为何要定义接口?------>实现不同的方法 Java的设计思想是单继承和多实现 类:属性和方法的集合,方法围绕着属性转,可以理解为自定义的类型 接口:与类是 ...
- Java学习笔记_22_Set接口的实现类
22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不 ...
- Java学习笔记之接口和抽象类
接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以 ...
- Java学习笔记 抽象类 接口 多态
instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...
- java学习笔记_接口
接口:interface(关键字) public interface USB {} 1. 接口中都是抽象方法,方法前面的可见度(public.private)和抽象关键字(abstract)可以不写. ...
- Java学习笔记——Map接口
Map接口 Map接口 Map接口中键和值一一映射. 可以通过键来获取值. 异常 NoSuchElementException:访问的值不存在 ClassCastException:对象类型错误 Un ...
随机推荐
- [Everyday Mathematic]20150213
设 $f:\bbR\to\bbR$ 三阶可微, 试证: 存在 $\xi\in (-1,,1)$, 使得 $$\bex \frac{f'''(\xi)}{6}=\frac{f(1)-f(-1)}{2}- ...
- Yii 显示错误信息(Fatal Error,Warning)在页面上
Yii由于设计上对于一些php奇怪问题的顾虑,并没有像cake,kohana一样把php错误信息打印在页面上. 遇到错误时,只是显示白页,这让没有经验的programmer会一头雾水. 实际上通常vh ...
- Delphi Val函数
在这里Val和iif都是你所用的数据库中的函数在delphi中Val是一个将字符串转换为数字的函数,Val(S; var V; var Code: Integer)第一个参数是要转换的字符串,第二个参 ...
- angularjs $swipe调用方法
angularjs 的$swipe,用法: $swipe.bind(angular.element(document),{ start: function(pos) { }, move: functi ...
- 性能测试指标&说明 [解释的灰常清楚哦!!]
详见: 浅谈软件性能测试中关键指标的监控与分析 http://www.51testing.com/html/18/n-3549018.html
- 代理抓取RSS信息
最近工作很闲,就自己写了一个可以看RSS订阅的网站.话说,RSS阅读器到处都是,随便下一个就可以了,为什么还去做一个网站形式的呢?作为一个热(xian)爱(de)前(dan)端(teng)的程序员,我 ...
- python程序中自启动appium服务
普通启动Appium服务方法: 打开cmd,运行命令: #>appium -a 127.0.0.1 -p 4723 当程序输出如上图信息的时候,表示appium启动成功,此时便可以运行 ...
- 新霸哥带你进入java的世界
新霸哥从近期大家的留言中注意到了大家对基础知识比较重视,很多的朋友希望多讲一些入门的知识,为了满足广大开发爱好者的需求,新霸哥决定从最基础的做起,一点一点的帮助大家一起走进云计算的世界.下面新霸哥首先 ...
- Visual Basic相关图书推荐
Visual Basic从入门到精通(第2版) 作 者 国家863中部软件孵化器 编 出 版 社 人民邮电出版社 出版时间 2015-03-01 版 次 2 页 数 61 ...
- 获取子窗口中使用jQuery.data()设置的参数
http://hyj1254.iteye.com/blog/643035 假设在iframe子窗口中设置了$('#mydata').data('key','hello world'); 那在包含ifr ...