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 MAX_LINE = 40;
  • 接口里面的方法只能是抽象方法,即只声明一下函数类型,名称和参数列表,但是不可以提供具体实现

二、接口的继承

考虑如下代码:

 1 interface A
 2 {
 3     int PROP_A = 5;
 4     void testA();
 5 }
 6 interface B
 7 {
 8     int PROP_B = 6;
 9     void testB();
10 }
11 interface C extends A, B
12 {
13     int PROP_C = 7;
14     void testC();
15 }
16
17 public class myJavaTest
18 {
19     public static void main(String[] args)
20     {
21         System.out.println(C.PROP_A);
22         System.out.println(C.PROP_B);
23         System.out.println(C.PROP_C);
24
25     }
26 }

输出:

5

6

7

  • 接口的继承和类的继承不一样,接口支持多继承,多个父接口排在extends关键字之后,多个父接口之间用逗号隔开,如上面11行所示,子接口C继承了父接口A和B
  • 子接口继承类父接口之后,可以获得它们的成员常量的访问权限。如21 -23行通过子接口C可以访问父接口A,B的成员常量PROP_A和PROP_B

三、接口的实现和定义

考虑如下程序:

 1 interface Output
 2 {
 3     int MAX_LINE = 4;
 4     void out();
 5     void getData(String msg);
 6 }
 7
 8 interface Product
 9 {
10     int getProductTime();
11 }
12
13 //实现简单的打印作业
14 public class Printer implements Output, Product
15 {
16     private String[] printData = new String[MAX_LINE];
17     private int dataNum = 0; // 记录需要打印的作业数
18
19     public void out()
20     {
21         while (dataNum > 0)
22         {
23             System.out.println("打印机打印" + printData[0]);
24
25             //把作业队列整体前移一位,并将剩下的作业数减1
26             System.arraycopy(printData, 1, printData, 0, --dataNum);
27         }
28
29     }
30
31     @Override
32     public int getProductTime() {
33         // TODO Auto-generated method stub
34         return 45;
35     }
36
37     @Override
38     public void getData(String msg)
39     {
40         if (dataNum >= MAX_LINE)
41         {
42             System.out.println("输出队列已满,添加失败");
43         }
44         else
45         {
46             //把打印数据添加到队列里,作业数加1
47             printData[dataNum++] = msg;
48         }
49     }
50     public static void main(String[] args)
51     {
52         //创建一个Printer对象,当成Output使用
53         Output O = new Printer();
54         O.getData("123");
55         O.getData("456");
56         O.getData("789");
57         O.getData("ABC");
58         O.getData("def");
59         O.out();
60         //创建一个Printer对象,当成Product使用
61         Product P = new Printer();
62         System.out.println(P.getProductTime());
63     }
64 }

输出:

输出队列已满,添加失败
打印机打印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类的子类,也是Output类的子类,这就是传说中的Java的模拟多继承。

Java学习笔记之接口,布布扣,bubuko.com

时间: 2024-11-03 21:37:56

Java学习笔记之接口的相关文章

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

Java学习笔记_21_Collection接口

21.Collection接口: 1>容器类的添加.删除: · add(Object o) :将对象添加到集合. · Remove(Object o) :删除集合中与o相匹配的对象. 2>容器中类的查询: · Size(): 返回集合中元素的个数. · isEmpty(): 判断集合中是否包含元素. · contains(Object o): 判断集合中是否包含指定元素. · iterator(): 返回集合的一个迭代器,用来访问该集合的元素. · contains(Collection c)

Java学习笔记_24_Map接口

24.Map接口: Map接口定义了存储"键(key)-值(value)映射对"的方法,Map中不能有重复的"键", Map实现类中储存的"键-值"映射对是通过键来唯一标识的,Map底层的"键"使用Set来存放的, 所以Map中的映射对的"键"对应的类必须重写hashCode()和equals()方法, 常用String作为Map的"键".  Map的添加.删除操作: · Object 

Java学习笔记_22_Set接口的实现类

22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不保存元素的加入的顺序. 样例: import java.util.HashSet; import java.util.Iterator; public class Student { public static void main(String[] args) { HashSet<String>

Java学习笔记之接口和抽象类

接口(interface)1.interface创建一个接口,implements实现接口 interface jiekou{} class lie implements jiekou{}2.接口可以有属性,但必须赋值,不建议在接口定义属性(可用于定义常量)3.接口,可以定义与接口同名的方法4.接口的所有方法都没有方法体 interface jiekou{void a();} 5.接口定义的方法的权限修饰默认是public,实现接口的类重写其方法时,必须显示声明public修饰:6.实现接口的类

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

java学习笔记8--接口总结

接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note8.html,转载请注明源地址. 生活中的接口: 什么是接口? 一个Java接口是一些方法特

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者