前一篇:
这一篇,我们开始去分享接口
正文
在抽象类中,抽象方法本质上是定义接口规范:即规定类的接口,从而保证所有子类都有相同的接口实现,这样多态就能发挥出作用。
如果一个抽象类没有字段,所有方法全部都是抽象方法:
abstract class Food {
public abstract void getTax() ;
public abstract void say();
}
那么这样的一个抽象类,就可以如下改造
interface Food {
void getTax() ;
void say();
}
这样就完成了一个接口的定义。所有的接口的方法都是public abstract方法。那么如何去使用这样一个接口呢,很简单
class Manto implements Food{
@Override
public void getTax() {
}
@Override
public void say() {
}
}
interface Food {
void getTax() ;
void say();
}
可以看到,类要去实现,用implements,这里完成后,需要重写里面所有的方法。
那么一个类,可以实现多个接口吗?我们测试下
interface Food {
void getTax() ;
void say();
}
interface name {
void getname() ;
void setname();
}
然后在类中去实现
}
class Manto implements Food,name{
@Override
public void getTax() {
}
@Override
public void say() {
}
@Override
public void getname() {
}
@Override
public void setname() {
}
}
可以看到是成功的,没有报错,这样就可以证明,一个类可以实现多个接口,但是一个类只能实现一个类如下
class Manto extends Food,name{
@Override
public void getTax() {
}
@Override
public void say() {
}
@Override
public void getname() {
}
@Override
public void setname() {
}
}
class Food {
void getTax() {
}
void say() {
}
}
class name {
void getname() {
}
void setname() {
}
}
看idea,报错了
运行下
直接也是报错的。
那么接口之间能否继承呢?我们尝试下
interface Food extends name{
void getTax() ;
void say();
}
interface name {
void getname() ;
void setname();
}
可以看下,没有报错,我们在类上使用下
class Manto implements Food{
@Override
public void getTax() {
}
@Override
public void say() {
}
@Override
public void getname() {
}
@Override
public void setname() {
}
}
写一个方法测试下
public class Main {
public static void main(String[] args) {
Food food=new Manto() ;
food.say();
}
}
结果执行
在接口中,可以定义一个default方法
public class Main {
public static void main(String[] args) {
Food food=new Manto() ;
food.getname();
}
}
class Manto implements Food{
@Override
public void getTax() {
}
@Override
public void say() {
}
@Override
public void setname() {
}
}
interface Food extends name{
void getTax() ;
void say();
}
interface name {
default void getname(){
System.out.println("name");
} ;
void setname();
}
这个方法,我们不去实现,默认的执行的时候,就执行默认的。结果如下
如果我们在继承后,重写了getname方法
public class Main {
public static void main(String[] args) {
Food food=new Manto() ;
food.getname();
}
}
class Manto implements Food{
@Override
public void getTax() {
}
@Override
public void say() {
}
@Override
public void setname() {
}
@Override
public void getname() {
System.out.println("mantou");
}
}
interface Food extends name{
void getTax() ;
void say();
}
interface name {
default void getname(){
System.out.println("name");
} ;
void setname();
}
结果
证明接口中的default 方法可以复写。