接口是抽象类的一种。
Java不支持多重继承,可通过接口实现。
8.2.1 接口定义
[public] interface 接口名 [extends 父接口名列表]
{
[public] [static] [final] 域类型 域名 = 常量值 ;
[public] [abstract] 返回值 方法名(参数列表) [throw 异常列表];//别忘了默认也是这些修饰!
}
//自定义接口举例
interface Copyable {
Object copy ();
}
别忘了默认也是这些修饰!
- 声明接口可给出访问控制符;
- 一个接口还可以继承多个父接口,父接口间用逗号分隔。
- 系统默认接口中所有属性的修饰都是public static final;
系统默认接口中所有方法的修饰都是public abstract。
8.2.2 接口的实现
实现接口的类要将接口带来的抽象方法覆盖!
一个类可以实现多个接口。在类的声明部分用implements关键字声明该类将要实现的接口,接口间用逗号分隔;
- 如果实现某接口的类不是抽象类,则该类必须实现指定接口的所有抽象方法;
接口的抽象方法的访问限制符默认为 public,在实现时要在方法头中显式地加上public修饰。 ```java interface Copyable { //[public] Object copy ();默认为public Object copy (); } class Book implements Copyable { String book_name; // 书名 String book_id; // 书号 public Book(String name ,String id) {
book_name = name;
book_id = id;
} public Object copy () { //public 一定要! //这里是否可为Book类型?返回值为子类Book时,可改为Book
return new Book(book_name , book_id);
} //实现接口的类要将接口带来的抽象方法覆盖! …
public String toString(){
return super.toString()+" ,书名:"+book_name+",书号="+book_id;
} public static void main (String [] args) {
Book x = new Book("Java程序设计","ISBN8359012");
System.out.println(x);
System.out.println(x.copy());
Book y = (Book)x.copy();
System.out.println(y);
} }
运行结果: 书名:Java程序设计,书号=ISBN8359012 书名:Java程序设计,书号=ISBN8359012 书名:Java程序设计,书号=ISBN8359012
定义StartStop接口,其中含start()和 stop()方法。
- “课堂”实现该接口,”汽车”实现该接口。
- 测试用接口引用具体对象,调用方法。
```java
interface StartStop{
public void start();
public void stop();
}
class classroom implements StartStop{
public void start(){
System.out.println("上课了");
}
public void stop(){
System.out.println("下课了");
}
}
class car implements StartStop{
public void start(){
System.out.println("车启动了");
}
public void stop(){
System.out.println("车停了");
}
}
public class Test {
public static void main(String a[ ])
{
StartStop []s=new StartStop[2];
s[0]=new classroom();
s[1]=new car();
for(StartStop t:s)
{
t.start();
t.stop();
}
}
}
二义性问题
interface Frob { //接口定义
float v = 2.0f; //默认final
}
class Parent { //父类定义
int v = 3; //默认不同于C++,(同一类中可以访问,同一包中可以访问)
}
class Test extends Parent implements Frob {
public static void main(String[] args) {
new Test().printV();
}
void printV() {
System.out.println((super.v + Frob.v)/2); //super.v父类 Frob.v 接口
}
}