1.接口是什么
2.implement关键字
3.接口的多实现
4.接口的好处
5.接口可以多继承
1.接口是什么
接口也是一个抽象类,只是不用class修饰,而用interface关键字修饰。接口里的成员有两种,一种是全局常量,一种是抽象方法。
1.当一个抽象类中的所有成员只有抽象方法时,便是一个接口,可以用关键字interface表示。
2.接口中的成员有两种:1.全局常量 2.抽象方法
3.接口中的权限必须是public,若没写public,会自动加上public。
4.接口中有抽象方法,因此接口也是抽象类,不可以实例化。所以其子类也必须覆盖了接口中所有的抽象方法后,才能实例化,否则他也是一个抽象类。
interface inter
{
public static final int NUM=5;
public abstract void interface1();
public abstract void interface2();
}
接口的存在意义在于被继承,子类继承了接口之后,在子类中实现这些接口。
2.implement关键字
接口的继承不用extends关键字,而是用implement关键字,意为实现的意思;
3.接口的多实现
Java语言不接受类的多继承,但接受接口的多实现。
什么是多实现?就是:有多个接口,而一个子类可以同时继承多个接口,获取多个接口提供的抽象方法。
为什么Java不接受多继承,却接受多实现?因为多继承中,多个父类的方法在父类中都有定义了,那么当子类继承多个父类时,若父类们中有同名的方法,那么子类调用的时候就不明确要调用哪一个父类的方法。而多实现中,因为多个接口中的方法都是抽象方法,全都还没定义的,所以即使不同的接口中有同名的抽象方法,也不会导致子类定义抽象方法后调用时出现不知道调用哪一个的问题。但对于变量来说,同名的还是会存在不知道调用哪一个变量的错误。
interface interA //接口A给出method1和method2两个抽象方法
{
public static final int NUM =5;
public abstract void method1();
public abstract void method2();
}
interface interB //接口B给出method1和method3两个抽象方法
{
public static final int NUM=2;
public abstract void method1();
public abstract void method3();
}
class Imp implements interA,interB //类Imp继承上述两个接口,要实现继承所得的所有抽象方法。
{
public void method1()
{
System.out.println("method1");
}
public void method2()
{
System.out.println("method2");
}
public void method3()
{
System.out.println("method3");
}
}
public class Main
{
public static void main(String[] args)
{
Imp p = new Imp();
//System.out.println(p.NUM); 这句在会出错,因为不interA和interB都有NUM且已经定义了,所以会不知道调用哪一个
p.method1();
p.method2();
p.method3();
}
}
4.接口的好处
1.避免了Java语言单继承的局限性。
因为当子类继承了父类之后,子类想要扩展功能就不行了,因为不能多继承,所以子类不能通过再继承一个父类来达到功能的扩展,这时候唯有通过接口的实现来额外扩展子类功能。
2.那如果父类和接口中有同名的方法呢?
如果父类和接口中有同名的方法,子类就可以不实现该接口的抽象方法也可以,因为会自动拿父类中定义了的同名方法来当抽象方法的实现。子类自己再重写实现一个抽象方法也可以,那就相当于覆盖了父类原有的方法。
class Parent
{
public void fun1()
{
System.out.println("fun1 from Parent");
}
}
interface inter
{
public abstract void fun1();
public abstract void fun2();
}
class Son extends Parent implements inter
{
public void fun1()
{
System.out.println("fun1 from Son");
}
public void fun2() //fun2这个方法相当于从接口扩展过来的功能
{
System.out.println("fun2 from Son");
}
}
public class Main
{
public static void main(String[] args)
{
Son s = new Son();
s.fun1(); //打印出:fun1 from Son
}
}
在Java中,类与类之间不能多继承,因为类中的方法都已经定义了,一旦方法重名,多继承就时子类就会不知道调用哪一个方法。
而在接口中,由于接口中的抽象方法都没有定义的,所以即使多继承,子类也不存在不知道调用哪一个的问题,因为都没定义,子类继承到自己类中才开始定义。所以接口可以支持多继承。
interface interA
{
public abstract void method1();
}
interface interB
{
public abstract void method2();
}
interface interC extends interA,interB //接口C继承了接口A和接口B的方法。
{
}
class Text implements interC
{
public void method1()
{
System.out.println("method1");
}
public void method2()
{
System.out.println("method2");
}
public void method3()
{
System.out.println("method3");
}
}
public class Main
{
public static void main(String[] args)
{
Text t = new Text();
t.method1();
t.method2();
t.method3();
}
}
打印结果:
method1
method2
method3