java中的接口(interface)

java的接口(interface)

要学习Java中的接口,我们首先要认识什么是接口.

1.接口是什么?

接口,是java的一种引用类型,接口的内部封装了抽象方法(JDK7及以前),在JDK8版本新增了默认方法和静态方法,在JDK9新增了私有方法。在定义接口时使用interface关键字。接口不能创建对象,但可以被实现(通过implements关键字来实现),一个实现接口的类,需要实现接口全部的抽象类,创建该类的对象就可以调用方法了。接口中没有静态代码块。

2.接口的定义方式

(JDK7及之前)

public interface 类名 (后边可以跟继承){
    //在类中可以定义抽象方法,在定义方法时,public abstract 可以省略(默认)
    public abstract void 方法名();
    //在类中还可以定义常量,不可以定义变量,默认被public static final修饰
    public static final 变量类型 变量名 初始化;
    
}

可以看到在接口中定义抽象方法,没有方法体,需要子类去实现。

(JDK8新增了默认方法和静态方法)

public interface 类名 (后边可以跟继承){
    //静态方法
    public static void dog(){
        //执行语句
    }
    //默认方法
    public default void cat(){
        //执行语句
    }
}

(JDK9新增了私有方法)

public interface 类名 (后边可以跟继承){
	//私有方法
    private void tiger(){
        //执行语句
    }
}

接口不能定义构造方法,哪怕这个类是抽象的,所以接口不能实例化

3.接口的实现

使用implement关键字来实现接口,实现接口的类称为接口的子类,一个类可以同时实现好几个接口,只要实现接口中的全部的抽象方法。

例如:定义一个Animal接口,编写具体的类来实现

/*
 *    定义一个Animal的抽象类
 *      定义两个抽象方法,eat()和sleep()
 * */
public interface Animal{
    // 定义一个抽象方法吃
    void eat();//public abstract 省略,依然为抽象方法
    // 定义一个抽象方法睡觉
    void sleep();
}
//定义一个dog类来实现Animal
class dog implements Animal{
    //需要实现Animal中的两个抽象方法
    @Override
    public void eat() {
        System.out.println("dog eat");
    }

    @Override
    public void sleep() {
        System.out.println("dog sleep");
    }
}

同时一个类可以实现多个接口,只要实现这些接口中的全部抽象方法

//定义一个dog类来实现Animal,Person
class dog implements Animal,Person{
    //需要实现Person中的抽象方法
    @Override
    public void smile() {
        System.out.println("person smile");
    }

    //需要实现Animal中的两个抽象方法
    @Override
    public void eat() {
        System.out.println("dog eat");
    }

    @Override
    public void sleep() {
        System.out.println("dog sleep");
    }
}

定义测试类

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        dog.sleep();
        dog.smile();
    }
}

在接口中定义默认方法和静态方法

public class Class02 {
    public static void main(String[] args) {
        P p = new P();
        //通过子类对象来调用父类方法
        p.testDefault();
        //通过类名来调用静态方法
        Pizza.testStatic();
    }
}
//定义一个接口Pizza
interface Pizza{
    //定义一个静态方法
    public static void testStatic(){
        System.out.println("这是接口中的静态方法");
    }
    //定义一个默认方法
    public default void testDefault(){
        System.out.println("这是接口中的默认方法");
    }
}
//定义一个P类来实现Pizza接口
class P implements Pizza{
    //由于接口中并没有抽象方法,并不需要实现
}

可以看到在接口中定义的默认方法和静态方法,我们可以通过子类对象和接口类名来进行调用,这一点和继承一样,子类调用父类方法。所以也可以在子类中对父类方法进行重写。

在接口中定义私有方法:

public class Class03 {
    public static void main(String[] args) {
        A a = new A();
    }
}
//定义一个接口类
interface Lover{
    //定义一个私有方法
    private void f1(){
        System.out.println("这是一个接口中的私有方法");
    }
}
//定义一个实现类
class A implements Lover{
}

会发现调用不到f1方法

4.优先级的问题

当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。

5.接口的多继承

一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用 extends 关键字,子接口继
承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值