java-接口

接口

接口,是Java语言中一种引用类型,是功能(方法)的集合,是一种规范,定义的是一组规则,是更加纯粹的抽象类,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。

作用

(1)对现有的功能进行扩展

(2)提供一种规范,实现这个接口的类按照这个规范去实现相应的功能

(3)弥补了Java中单一继承的不足,使不相关的类具有相同的行为方法,实现多重继承

格式
[访问修饰符] interface 接口名 【extends 父接口1,父接口2.......{
    [常量;]//常量被public static final修饰,系统默认,可省略不写
    [抽象方法;]//抽象方法被public abstract修饰,系统默认,可省略不写
    [默认方法;]//必须使用default修饰符,JDK8以后才有
    [静态方法;]//JDK8以后才有
    [私有方法;]// JDK9以后才有
    [枚举类型;]
}

注意:

当接口继承的接口有默认方法时:

  • 如果多个父接口中的默认方法有重名的,那么子接口需要重写一次。

  • 子接口重写默认方法时,default关键字可以保留。

  • 子类重写默认方法时,default关键字不可以保留。

示例:

public interface Interable {
    public static final int a = 20;
    int b = 30; // 默认被 public static final修饰,修饰符可省略不写
    public abstract void run();
    void eat();// 默认被 public abstract 修饰,修饰符可省略不写
    // 可以存在默认方法,但是必须显式使用 default 修饰
    default void sleep(){
        System.out.println("睡觉");
    }
    // 可以存在静态方法
    static void game(){
        System.out.println("玩游戏");
    }
    enum season {STRING,SUMMER, AUTUMN,WINTER}; // 枚举类
    private void testPrivate(){
        System.out.println("测试接口中定义私有方法");
    }
}
class InteImpl implements Interable {
    @Override
    public void run() {
        System.out.println("跑步");
    }
 
    @Override
    public void eat() {
        System.out.println("吃东西");
    }
}
class Test {
    public static void main(String[] args) {
        Interable i = new InteImpl();
        System.out.println(i.a);
        System.out.println(Interable.a);
        System.out.println(i.b);
        System.out.println(Interable.b);
        i.run();
        i.eat();
        i.sleep();
    }
}
要点
  • 接口可以继承多个接口,中间用逗号隔开,具体子类通过implements关键字实现接口中的规范

  • 任何类实现接口时必须实现该接口中的所有抽象方法,否者该实现类为抽象类(意义不大)

  • 接口的多态与普通类一致,接口引用只能调用接口拥有的方法

  • 子类可以既继承父类又实现接口 [访问修饰符] class 类名 extends 父类 implements 接口1,接口2....,当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。

  • 如果实现的多个接口中有多个重名的抽象/默认方法,则实现类必须重写一次抽象/默认方法

  • 接口没有构造方法、动态代码块、静态代码块,因为接口主要是用来扩展功能的,是没有具体存在的

  • 接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态

interface A {
    public abstract void showA();
    public abstract void show();
    public default void methodA(){}
	public default void method(){}
}
interface B {
    public abstract void showB();
    public abstract void show();
    public default void methodB(){}
	public default void method(){}
}
public class C implements A,B{
    @Override
    public void showA() {
    	System.out.println("showA");
    }
    @Override
    public void showB() {
    	System.out.println("showB");
    }
    @Override
    public void show() {
    	System.out.println("show");
    }
    @Override
    public void method() {
    	System.out.println("method");
    }
}

接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值