作者:云都小生
概述
在Java面向对象中,Java与C#同样, 只支持单继承关系——即一个类只能有一个父类。但是现实中却有这样的需求——金银花是一种花,但它还是一种草药。如何解决这种需求,我们就需要用到接口。
一个类只能继承一个父类,但是一个类可以实现多个接口。
接口是一系列方法的声明,是一些列方法特征的集合,一个接口只能纯粹有方法的特征,但方法不能有实现。这是与抽象类的区别。
了解语法
我们来看一下接口的语法
public interface 接口名
{
public 返回值 方法名称(参数列表);
····
}
记住,在接口中,只有方法的声明,不允许定义方法的实体。
如何实现一个接口?
public class 类名 implements 接口名称
{
//若是有接口方法,就必须实现
}
无论该类实现的接口有多少个方法,都需要在实现类中实现。
package InterfaceText;
public interface IEat {
public void eat();
}
class Student implements IEat
{
public void eat()
{
System.out.println("学生去食堂吃饭");
}
}
class Police implements IEat
{
public void eat()
{
System.out.println("警察去餐厅吃饭");
}
}
//测试代码
Student stu = new Student();
stu.eat();
Police pol = new Police();
pol.eat();
接口并不在乎实现类是如何实现的,只要实现类有实现这个方法即可。
实现多个接口
实现多个接口的语法是
public class 实现类 implements 接口1,接口2,接口3
{
}
当实现多个接口的时候,可能会碰到一个难点——实现的多个接口中声明了一模一样的方法,这个时候,只需要实现一次即可。
public interface IA {
public void test();
}
public interface IB {
public void test();
}
public class Test implements IA,IB
{
public void test()
{
//实现一次即可
}
}
另一种情况是这样的,两个接口的同样的方法名不同的返回值,
public interface IA {
public void test();
}
public interface IB {
public int test();
}
public class Test implements IA,IB
{
}
这个时候就很麻烦了,两个接口提供了同名不同返回值的方法,实现类实现了这两个接口之后,必须实现这两个方法。
但是,返回值不是判定是否为方法重写的标准,接口要求重写,实现类又不能同时写两个一样的方法。这个时候要么就选择修改接口的方法名,要么选择不实现该接口了。
继承一个实现接口的抽象类
来看一个实现类Test的代码
package InterfaceText;
public class Test {
public static void main(String[] args) {
//Java允许这样的语法
//这个是时候实现的,依旧是真是对象(stu)的方法
IEat ie1 = stu;
ie1.eat();
IEat ie2 = pol;
ie2.eat();
}
}
这些代码传达的是,我们可以将实现该接口的类看成是一个接口,但是实际上调用方法,还是会以多态去实现。
不实现接口的所有方法
如果继承了一个抽象类,该抽象类继承于某个接口,那这个具体类就要实现接口和抽象类中声明的方法。
public interface A {
public void MethodA();
}
abstract class B implements A
{
//抽象类实现了接口,可以不实现接口定义的方法
public abstract void MethodB();
}
class Test extends B
{
//如果继承了一个实现接口的抽象类,就必须实现接口、抽象类声明的所有方法
@Override
public void MethodA() {}
@Override
public void MethodB() {}
}
可以算是总结的总结
接口不允许被实例化——不允许用new创建对象。
接口的实现类需要实现接口类声明的所有方法,如果不想实现,需要将自身变成抽象类。
实现类可以实现多个接口。
public class 实现类 : 父类 implements 接口1,接口2····
接口中可以定义变量,但是定义的变量默认是static(静态)的,即使你不写static也默认是static,可以用类名调用。
面试难点
难点1:一个类实现了多个接口,这些接口都定义了相同的方法
Java中只能实现一次多个接口相同名的方法
若出现同一个方法名但不同返回值,就违背了方法重载的要求(返回值不是)难点2:抽象类实现接口
抽象类在实现接口的时候可以不实现接口的方法。但是实现这个抽象类的底层类,就必须实现抽象类、接口的所有方法。
难点3:接口继承接口
没有接口实现接口,只有接口继承接口这种语法
public interface IA extends IB{}难点4:接口中的变量
接口中可以定义变量,实现类的对象可以访问接口中定义的变量,还可以利用类名.变量的方式去访问。
2018/4/14 21:43:30 @Author:云都小生