Java --- 接口

目录

一、接口

二、注意事项

三、接口 VS 继承

四、接口多态

1、多态参数

2、多态数组

 3、多态传递


一、接口

接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。

基本语法:

interface 接口名{

//属性

//方法(抽象方法、默认方法、静态方法)

}

1、在Jdk7.0前接口里的所有方法都没有方法体,都是抽象方法。

2、Jdk8.0后接口类可以有静态方法,默认方法,也就是说接口中可以有方法的具体实现。

interface A{
    //属性
    public int a = 1;
    //抽象方法,在接口中可以不用写abstract关键字
    public void  a1();
    //默认方法
    default void a2(){
        System.out.println("我是接口1");
    }
    //静态方法
    public static void a3(){
        System.out.println("我是接口2");
    }
}

二、注意事项

1、接口不能被实例化。

 2、接口中所有的方法是public方法,接口中抽象方法,可以不用abstract修饰。

interface A1{
    public abstract void ok1();
    //默认可以不写abstract
    void ok2();
}

3、一个普通类实现接口,就必须将该接口的所有方法都实现。

interface A1{
    public abstract void ok1();
    //默认可以不写abstract
    void ok2();
}
class Cat implements A1{

    @Override
    public void ok1() {
        
    }

    @Override
    public void ok2() {

    }
}

4、抽象类实现接口,可以不用实现接口的方法。

interface A1{
    public abstract void ok1();
    //默认可以不写abstract
    void ok2();
}
abstract class Cat implements A1{
    
}

5、一个类可以同时实现多个接口。

interface A1{
     void ok1();
}
interface A2{
    void ok2();
}
 class Cat implements A1,A2{
     @Override
     public void ok1() {
     }
     @Override
     public void ok2() {
     }
 }

6、接口中的属性,只能是final的,而且是public static final 修饰符。

public class Test01 {
    public static void main(String[] args) {
        System.out.println(A1.a);
    }
}
interface A1{
     int a = 10;//默认使用public static final修饰
}

7、接口中属性的访问形式:接口名·属性名。

8、一个接口不能继承其它的类,但是可以继承多个别的接口。

interface A1{
     
}
interface A2{
    void ok2();
}
interface A3 extends A1,A2{}

9、接口的修饰符,只能是public和默认。

三、接口 VS 继承

1、接口和继承解决的问题不同:①、继承主要解决代码的复用性和可维护性。②、接口主要用于设计好各种规范(方法),让其它类去实现这些方法。

2、接口比继承更加灵活:继承是满足is - a的关系,而接口只需要满足like - a的关系。

3、接口在一定程度上实现代码解耦。

public class Test01 {
    public static void main(String[] args) {
        LittleMonkey monkey = new LittleMonkey("吉吉");
        monkey.climbing();
        monkey.swimming();
    }
}
//父类
class Monkey{
    private String name;

    public Monkey(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void climbing(){
        System.out.println(name + "会爬山");
    }
}
class LittleMonkey extends Monkey implements Fishable{

    public LittleMonkey(String name) {
        super(name);
    }

    @Override
    public void swimming() {
        System.out.println(getName() + "学会了游泳");
    }
}
interface Fishable{
    public void swimming();
}

 运行结果:

 总结:当子类继承了父类,会自动拥有父类的能力与属性;当子类需要扩展功能时,可以通过实现接口的方式扩展。实现接口是对Java单继承机制的一种补充。

四、接口多态

1、多态参数

public class Test02 {
    public static void main(String[] args) {
        //接口类型的变量dog可以指向实现了A接口的类的对象实例。
        A dog = new Dog();
        dog = new Cat();
    }
}
interface A{}
class Dog implements A{}
class Cat implements A{ }

2、多态数组

public class Test03 {
    public static void main(String[] args) {
        Usb[] usbs = new Usb[2];
        usbs[0] = new Phone();
        usbs[1] = new Camera();
        for (int i = 0; i <usbs.length ; i++) {
            usbs[i].work();//动态绑定
           if (usbs[i] instanceof Phone){//判断运行类型
               ((Phone)usbs[i]).call();//向下转型
           }
        }

    }
}
interface Usb{
    public void work();
}
class Phone implements Usb{
    @Override
    public void work() {
        System.out.println("手机在工作");
    }
    public void call(){
        System.out.println("手机在打电话");
    }
}
class Camera implements Usb{
    @Override
    public void work() {
        System.out.println("相机在工作");
    }
}

运行结果:

 3、多态传递

public class Test04 {
    public static void main(String[] args) {
        //接口类型的变量可以指向,实现了该接口的类的对象实例
        B2 b3 = new B3();
        //因为B2继承了B1接口,而B3类实现了B2接口
        //所以也相对于实现了B1接口
        B1 b1 = new B3();
    }
}
interface B1{}
interface B2 extends B1 {}
class B3 implements B2{}

五、JDK8与JDK9接口新特性

public interface A {
    //jdk8:静态方法
    public static void method(){
        System.out.println("这是一个静态方法");
    }
    //jdk8:默认方法
    default void method1(){
        System.out.println("这是一个默认方法");
    }
    //jdk9:私有方法
    private void method2(){
        System.out.println("这是一个私有方法");
    }
}
public class B implements A{
}
public class BTest {
    public static void main(String[] args) {
        //接口中的静态方法只能被接口自己调用,其实现类无法调用
       A.method();
       //接口中的默认方法可以被实现类继承,实现类没有重写该方法默认调用接口默认方法,
        // 否则调用实现类重写的方法
       new B().method1();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭鸭老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值