java基础[接口]

本文详细介绍了Java中的接口与抽象类的区别,包括接口的作用、具体类和抽象类的定义、接口的特性等。通过示例展示了如何创建和使用接口,以及接口与抽象类的组合使用。此外,还解释了Java中为何不支持多重继承,以及接口如何弥补这一不足。最后,给出了USB设备和鼠标类的实现作为练习,进一步巩固接口的应用。
摘要由CSDN通过智能技术生成

         接口作用:将两个不同的东西连接起来,让他们共同去工作!

        具体类:定义某一具体的事物;

        抽象类:定义某一类不同种的事物;

        接口:定义不同类型的不同种事物,但是却有共同的行为,注重事物的行为,而不是事物的种类。接口不是类,是一个特殊的存在。接口和类是并列的关系。在接口中的方法,需要定义为抽象公共方法,属性需要定义为全局常量(public static final)【基本不用】,接口是抽象的极致。在抽象类中可以直接定义方法:返回值 + 方法名即可。接口没有构造方法。

package com.hike.javase.interfacetest;

public interface Flayer {

    //抽象类中的方法都为全局常量 public static finall
    int num = 10;

    //public abstract void takeOff();
    void takeOff();

    public void fly();

    void land();
}

package com.hike.javase.interfacetest;

/**
 * Plane相当于子类,Flayer相当于父类
 */
public class Plane implements Flayer {
    public void takeOff(){
        System.out.println("飞机起飞了");
    }

    public void fly(){
        System.out.println("飞机在天空中飞");
    }

    public void land(){
        System.out.println("飞机着陆了");
    }

    public void addOil(){
        System.out.println("飞机要加油");
    }
}

package com.hike.javase.interfacetest;

/**
 * 接口不能实例化对象,但是可以子类可以实现接口,只能实现,不能继承
 */
public class FlayerTest {
    public static void main(String[] args) {

        Plane plane = new Plane();  //本态调用

        plane.takeOff();
        plane.fly();
        plane.land();
        plane.addOil();//类中私有方法,不实用多态可以调用

        Flayer flayer = new Plane(); //多态调用:子类对象可以看做是父类使用
        flayer.takeOff();
        flayer.fly();
        flayer.land();
       // flayer.addOil(); 多态不可以调用类的私有方法
    }
}

        练习:定义一个USB接口,定义三个方法,连接,工作,断开,在子类中实现它们,并完成测试。

package com.hike.javase.interfacetest;

public interface USB {

    void connect();

    void work();

    void disconnect();
}

package com.hike.javase.interfacetest;

public class Udisk implements USB{
    @Override
    public void connect() {
        System.out.println("USB正在连接");
    }

    @Override
    public void work() {
        System.out.println("USB正在工作");
    }

    @Override
    public void disconnect() {
        System.out.println("USB正在断开");
    }
}

package com.hike.javase.interfacetest;

public class USBTest {
    public static void main(String[] args) {
        Udisk udisk = new Udisk();
        udisk.connect();
        udisk.work();
        udisk.disconnect();

        USB usb = new Udisk();
        usb.connect();
        usb.work();
        usb.disconnect();
    }
}

        抽象类可以包含抽象方法,所以实现接口时可以对其抽象方法不予实现。

        子类可以同时继承父类并实现接口。public class Bird extends Pet implements Flayer{}。无形中子类同时间接有两个父类,间接实现了多继承。

        java中不能多继承的原因:如果多个父类中有相同的test()方法,那么会同时继承这三个test()方法,当调用test()时,会出现混乱,所以java使用了接口来弥补这个缺点,在接口中的方法是没有方法体的,不会造成同名方法的混乱,所以接口可以实现多继承。子类可以同时实现多个接口,只有在子类中重写接口中的抽象方法,子类才能够使用。

        练习:编写抽象类Decive,mouse类,测试类,实现USB接口,在测试类中完成本态,多态的调用。

package com.hike.javase.interfacetest;

public abstract class Decive {

    private static int no = 1;

    private final int ID;
    private String name;

    {
        ID = no++;
    }

    public Decive(){

    }

    public Decive(String name){
        super();
        this.name = name;
    }

    public int getID() {
        return ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Decive{" +
                "ID=" + ID +
                ", name='" + name + '\'' +
                '}';
    }

    public abstract void startup();

    public abstract void shutdown();


}


package com.hike.javase.interfacetest;

public class Mouse extends Decive implements USB {

    public Mouse() {
    }

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

    @Override
    public void startup() {
        System.out.println("鼠标启动了");
    }

    @Override
    public void shutdown() {
        System.out.println("鼠标关闭了");
    }

    @Override
    public void connect() {
        System.out.println("鼠标连接了");
    }

    @Override
    public void work() {
        System.out.println("鼠标工作了");
    }

    @Override
    public void disconnect() {
        System.out.println("鼠标断开了");
    }
}


package com.hike.javase.interfacetest;

import java.lang.management.MemoryUsage;

public class MouseTest {
    public static void main(String[] args) {
        Mouse mouse = new Mouse("华为"); //本态调用
        mouse.connect();
        mouse.startup();
        mouse.work();
        mouse.shutdown();
        mouse.disconnect();
        mouse.toString();

        USB usb = new Mouse("华为");
        usb.connect();
        usb.work();
        usb.disconnect();

        //Decive device = (Decive)usb;
        Decive decive = new Mouse("华为");
        decive.startup();
        decive.shutdown();
    }
}

        接口表现的是一种能力,表明事物可以做到什么。可以飞行的,可以奔跑的等等,在词性上看,是一个形容词。

        接口也可以继承另一个接口,使用extends关键字。接口只能继承接口,不能继承类,并且支持多继承。在子类中实现多个父类中的同名抽象方法,意思就是将所有接口中的同名方法全部重写,并不会引起混乱。

package com.hike.javase.interfacetest;

interface A{
    void test();
}

interface B{
    void test();
}

interface C{
    void test();
}

interface D extends A,B,C{
    void test();
}

class E implements D{
    public void test(){
        System.out.println("E test()");
    }
}

public class ExtendsTest {
    public static void main(String[] args) {
        B b = new E();
        b.test();
    }
}

  问题:接口中的属性是全局常量,当接口和父类中同时有一个同名属性,当子类继承父类并实现接口,当调用这个同名属性时会引起歧义。

接口规范的目的是越多的子类实现越好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OneTenTwo76

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

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

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

打赏作者

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

抵扣说明:

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

余额充值