标签:组合 必须 相同 方案 工业 并且 局限 编译 stat
先不谈接口,不妨设想一个问题?
如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类。你把这几个类拿给别人用,但是别人想给动物加上宠物功能,要怎么办呢?
根据以往的知识,我们可以:
把Pet方法加入Animal类
这样所有的子类都有Pet方法,以后新继承Animal的动物也有这个方法。
所以,这个方案,不太行。
还是和第一种方法一样,但是把Pet方法设成抽象方法
把方法具体加到需要的类里
多继承
难道这个问题就没有解决方案了吗?下面就欢迎我们今天的主角——
首先,什么是接口?
接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
回到刚刚第四个方法,如果想用多继承的思路但是又不产生冲突,那要怎么办呢?那就用接口。
接口解决冲突的方法很简单,把所有方法都设为抽象的,如此一来,子类要调用这些方法,就必须重新实现一遍,这样JVM就不会搞混了!
所有,接口就类似于一个100%的纯抽象类,可他又不是类。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
如何编写接口
public interface Pet{
// 关键词 interface
public abstract void play(); // public abstract可以省略,抽象方法没有内容
}
接口的实现
class Dog extends Animal implements Pet{
// 关键词 implements
// 接口的实现必须在某个类的继承之下
public void play(){
// 必须实现这个方法
}
}
接口的特性
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
public interface Pet{
public abstract void play(); // 抽象方法,分号结尾
}
其实不像上面那么写也可以
public interface Pet{
void play(); // 隐含了public abstract
}
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
我们为什么需要接口?
接口与抽象类的区别
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
接口的继承
接口和类一样,都可以继承。也使用extends关键词,子接口继承父接口的方法,但是可以改变传入参数。
public interface Pet{
void play();
}
interface wild_Pet extends Pet{
void play(String location);
}
虽然类不可以多继承,但是接口可以呀! 在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。
interface wild_Pet extends Pet, Sweeties{}
Pet和Sweeties可能定义或继承了相同的方法,但是没有关系,他们都是抽象的!
标签:组合 必须 相同 方案 工业 并且 局限 编译 stat
原文地址:https://www.cnblogs.com/scyq/p/11664293.html