接口
接口的基本定义:
如果一个类只是由抽象方法和全局常量组成的,那么在这种情况下不会将其定义为一个抽象类,而只会将其定义为接口。所以所谓的接口严格来讲就属于一个特殊的类,而且这个类只有抽象方法和全局常量。
一.定义接口:
在java中可以使用interface关键字来实现接口的定义。
代码如下:
interface A {
public static final String MSG = "HELLO" ;
public abstract void print() ;
}
本程序定义了一个A接口,在此接口中定义了一个抽象方法(print())和一个全局变量(MSG),但是由于接口中存在抽象方法,所以接口对象不可能直接使用关键字new进行实例化的操作。
二.接口的使用原则:
1.接口必须要有子类,但是此时一个子类可以使用implement关键字实现多个接口,避免单继承局限。
2.接口的子类(如果不是抽象类),必须要覆写接口中的全部抽象方法。
3.接口的对象可以利用子类对象的向上转型进行实例化操作。
三.实现接口:
interface A {
public static final String MSG = "HELLO" ;
public abstract void print() ;
}
interface B {
public abstract void get() ;
}
class X implements A,B {
public void print() {
System.out.println("A接口的抽象方法!");
}
public void get() {
System.out.println("B接口的抽象方法!");
}
}
public class TestDemo {
public static void main(String args[]) {
X x = new X() ;
A a = x ;
B b = x ;
a.print();
b.get();
System.out.println(A.MSG);
}
}
程序执行结果:
A接口的抽象方法!
B接口的抽象方法!
HELLO
本程序定义了两个接口A、B,同时在定义X子类时利用了implements关键字实现了两个接口,这样在X子类中就必须覆写两个接口中提供的全部抽象方法,同时X类的对象也就可以利用向上转型的概念,为A或B两个接口进行实例化操作。
四.子类继承抽象类并实现接口:
如果一个子类既要继承抽象类又要实现接口,那么应该采用先继承后实现接口的顺序完成。
interface A {
public abstract void print() ;
}
interface B {
public abstract void get() ;
}
abstract class C {
public abstract void change() ;
}
class X extends C implements A,B {
public void print() {
System.out.println("A接口的抽象方法");
}
public void get() {
System.out.println("B接口的抽象方法");
}
public void change() {
System.out.println("C接口的抽象方法“);
}
}
本程序X子类是接口A,B以及抽象类C三个的子类,所以X类的对象可以同时被三个父类实例化。
五.观察接口的多继承:
一个抽象类可以继承一个抽象类或者实现多个接口,但是反过来,一个接口却不能继承抽象类。但是一个接口却可以使用extends关键字同时继承多个父接口。
interface A {
public void funA() ;
}
interface B {
public void funB() ;
}
interface C extends A,B {
public void funC();
}
class X implements C {
public void funA() {}
public void funB() {}
public void funC() {}
}
本程序在定义接口C时使用extends关键字继承了两个父接口,这就相当于C接口中一共定义了3个抽象方法(funA()和funB()通过父接口继承下来),所以在定义X子类时必须覆写三个抽象方法。
六.在接口里定义抽象类:
虽然在接口本身的概念上来讲只能够由抽象方法和全局常量组成,但是所有的内部结构不受这些要求的限制,也就是说在接口里面可以定义普通内部类、抽象内部类、内部接口。
interface A {
public void funA() ;
abstract class B {
public abstract void funB() ;
}
}
class X implements A {
public void fun A() {
System.out.println("Hello,world!");
}
class Y extends B {
public void funB() {}
}
}
本程序在A接口的内部定义了一个内部抽象类B,这样A接口的X子类就可以根据自己的需求来选择是否要继承内部的抽象类B。
强调:
在一个接口内部如果使用static去定义一个内部接口,该接口就表示一个外部接口。