目录

1、接口概述

2、接口的好处

3、接口的综合小案例

4、接口新增的三种方法

5、接口的几个注意事项

6、抽象类和接口的区别

7、综合小案例


1、接口概述

        Java提供了一个关键字interface定义出接口。

接口的格式

public interface 接口名{

        // 成员变量(常量

        // 成员方法(抽象方法)

}

A 接口

public interface A {
    //在JDK8之前,接口中只能定义常量和抽象方法
    //1、常量:接口中定义可以省略public static final不写,默认会加上去。
    String SCHOOL_NAME = "清华大学";
    //public static final String SCHOOL_NAME1 = "清华大学";
    
    //2、抽象方法:接口中定义可以省略public abstract不写,默认会加上去。
    //public abstract void show();
    void show();
}
  • 注意:接口不能创建对象
  • 接口是用来被实现(implements)的,实现接口的类称为实现类一个类可以同时实现多个接口。

实现类的格式:

修饰符 class 实现类列类名 implements 接口1,接口2,接口3, .....{

        //实现类实现多个接口,必须重写全部接口的全部抽象方法

        //否则实现类需要定义成抽象类。

}

A类

public interface A {
    //在JDK8之前,接口中只能定义常量和抽象方法
    //1、常量:接口中定义可以省略public static final不写,默认会加上去。
    String SCHOOL_NAME = "清华大学";
    //public static final String SCHOOL_NAME1 = "清华大学";

    //2、抽象方法:接口中定义可以省略public abstract不写,默认会加上去。
    //public abstract void show();
    void show();
}

B类

public class Test {
    public static void main(String[] args) {

        //接口不能创建对象
        //实现类实现多个接口,必须重写接口中所有抽象方法,否则这个类必须定义成抽象类
        C c = new C();
        c.show();
        c.run();
    }
}

class C implements A,B {
    @Override
    public void show() {
        System.out.println("show()");
    }
    @Override
    public void run() {
        System.out.println("run()");
    }
}
/*
show()
run()
 */

Test类

public class Test {
    public static void main(String[] args) {
        C c = new C();
        c.show();
        c.run();
    }
}

class C implements A,B {
    @Override
    public void show() {
        System.out.println("show()");
    }
    @Override
    public void run() {
        System.out.println("run()");
    }
}
/*
show()
run()
 */

2、接口的好处

  • 弥补了类单继承的不足,一个类同时可以实现多个接口,使类的角色更多,功能更强大。
  • 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(更利于程序解耦合)。

Test类:理解接口的好处

public class Test {
    public static void main(String[] args) {
        //目标:去理解Java设计接口的好处,用处
        //接口弥补了类单继承的不足,可以让类拥有更多角色,类的功能更强大。
        People p = new Student();
        Driver d = new Student();  //多态
        BoyFriend bf = new Student();

        //2、接口可以实现面向接口编程,更有利于解耦合
        Driver d1 = new Teacher();  //右侧可以换成Student有利于解耦合
    }
}
interface Driver{} //司机类
interface BoyFriend{} //BoyFriend类
class People{} //人类

class Student extends People implements Driver,BoyFriend{}

class Teacher  implements Driver,BoyFriend{}

3、接口的综合小案例

Student 类

public class Student {
    private String name;
    private String sex;
    private double Score;

    public Student(String name, String sex, int Score) {
        this.name = name;
        this.sex = sex;
        this.Score = Score;
    }
    private Student() {}

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public double getGrade() {
        return Score;
    }

    public void setGrade(int grade) {
        this.Score = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", Score=" + Score +
                '}';
    }
}

ClassDataInter 类

public interface ClassDataInter {
    void printAllStudentInfos();
    void printStudentAvgScore();
}

ClassDataInterImpl1 类

public class ClassDataInterImpl1 implements ClassDataInter {
    Student[] students;
    public ClassDataInterImpl1(Student[] students) {
        this.students = students;
    }

    @Override
    public void printAllStudentInfos() {
        //定义第一套实现类,实现接口:实现打印全部学生信息,打印平均分
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i]);
        }
    }

    @Override
    public void printStudentAvgScore() {
        double sum = 0;
        for (int i = 0; i < students.length; i++) {
            sum += students[i].getGrade();
        }
        System.out.println("平均分:" + sum / students.length);
    }
}

ClassDataInterImpl2 类

public class ClassDataInterImpl2 implements ClassDataInter {
    //实现接口:实现打印全部学生信息(打印男女人数),打印平均分(去掉最高分和最低分)
    Student[] students;
    public ClassDataInterImpl2(Student[] students) {
        this.students = students;
    }
    @Override
    public void printAllStudentInfos() {
        //实现接口:实现打印全部学生信息(打印男女人数),打印平均分(去掉最高分和最低分)
        int manNum = 0;
        int womanNum = 0;
        for (int i = 0; i < students.length; i++) {
            if(students[i].getSex().equals("男")){
                manNum++;
            }else{
                womanNum++;
            }
            System.out.println(students[i]);
        }
        System.out.println("男性人数是:" + manNum);
        System.out.println("女性人数是:" + womanNum);

    }

    @Override
    public void printStudentAvgScore() {
        //打印平均分(去掉最高分和最低分)
        double max = students[0].getGrade();
        double min = students[0].getGrade();
        for (int i = 0; i < students.length; i++) {
            if (students[i].getGrade() > max) {
                max = students[i].getGrade();
            }
            if (students[i].getGrade() < min) {
                min = students[i].getGrade();
            }
        }
        double sum = 0;
        for (int i = 0; i < students.length; i++) {
            sum += students[i].getGrade();
        }
        System.out.println("平均分是:" + (sum - max - min) / (students.length - 2));

    }
}

Test类

public class Test {
    public static void main(String[] args) {
        //目标:完成接口小案例
        //1、定义学生类,创建学生对象,封装学生数据,才能交给别人处理学生数据
        //2、准备学生数据,目前我们自己造一些数据
        Student [] allstudents = new Student[10];
        allstudents[0] = new Student("张三","男",77);
        allstudents[1] = new Student("李四","男",66);
        allstudents[2] = new Student("王五","女",89);
        allstudents[3] = new Student("赵六","男",88);
        allstudents[4] = new Student("孙七","不",80);
        allstudents[5] = new Student("周八","男",64);
        allstudents[6] = new Student("吴九","男",60);
        allstudents[7] = new Student("郑十","女",95);
        allstudents[8] = new Student("王十一","男",100);
        allstudents[9] = new Student("王十二","女",99);
        //3、提供两套业务实现方案,支持灵活切换(解耦合):面向接口编程
        //---定义一个接口(规范思想):必须完成打印全部学生信息,打印平均分
        //---定义第一套实现类,实现接口:实现打印全部学生信息,打印平均分
        //---定义第二套实现类,实现接口:实现打印全部学生信息(打印男女人数),打印平均分(去掉最高分和最低分)

        //创建接口实现类对象
        ClassDataInter cdi1 = new ClassDataInterImpl1(allstudents);
        cdi1.printAllStudentInfos();
        cdi1.printStudentAvgScore();
    }
}

4、接口新增的三种方法

        JDK 8开始,接口新增了三种形式的方法。

        接口中为什么新增了方法?增强了接口的能力,更便于项目的扩展和维护。

5、接口的几个注意事项

  • 接口与接口可以多继承:一个接口可以同时继承多个接口[重点]。
  • 一个接口继承多个接口,如果多个接口中存在方法冲突,则此时不支持继承,也不支持多实现。
  • 一个类继承了父类,又同时实现了接口,如果父类中和接口中有相同的默认方法,实现类会优先用父类。
  • 一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这重写该方法即可。
public class Test {
    public static void main(String[] args) {
        CC c = new CC();
        c.test1();
        f f1 = new f();
        f1.test1();


    }
}

//4、一个类实现了多个接口,如果多个接口中存在同名的默认方法,可以不冲突,这重写该方法即可。
interface s{
    default void test1(){
        System.out.println("s接口中的Test1方法");
    }
}
interface t{
    default void test1(){
        System.out.println("t接口中的Test1方法");
    }
}
class f implements s,t{
    @Override
    public void test1() {
        System.out.println("实现类中的Test1方法");
    }
}

//3.一个类继承了父类,又同时实现了接口,如果父类中和接口中有相同的默认方法,实现类会优先用父类
interface  AA{
    default void test1(){
        System.out.println("接口中的Test1方法");
    }
}
class BB {
    void test1(){
        System.out.println("父类中的Test1方法");
    }
}
class CC extends BB implements AA{

}

//2、一个接口继承多个接口,如果多个接口中存在方法冲突,则此时不支持继承,也不支持多实现。
interface A1{
    void test1();
}
interface B1{
    int test1();
}
//如果两个方法完全一样,就不会报错,方法合并
//如果名字一样,参数不同或返回类型不同,就会报错
//interface C1 extends A1,B1{  //报错
//    void test3();
//}

//1、接口与接口可以多继承:一个接口可以同时继承多个接口[重点]。
//类和类:单继承一个类只能继承一个父类。
//类与接口:多实现,一个类可与同时实现多个接口。
//接口与接口:多继承,一个接口可以同时继承多个接口。
interface A{
    void test1();
}
interface B{
    void test2();
}
interface C extends A,B{  //多继承,一个接口可以同时继承多个接口。
    void test3();
}
class D implements A,B,C{  //多实现,一个类可与同时实现多个接口。
    @Override
    public void test1() {
    }

    @Override
    public void test2() {
    }

    @Override
    public void test3() {
    }
}

6、抽象类和接口的区别

7、综合小案例

JD 类:家电类

public class JD implements  Switch{

    private String name;
    private boolean status;       //状态,开关

    //构造器
    public JD(){}

    public JD(String name, boolean status) {
        this.name = name;
        this.status = status;
    }



    public String getName() {
        return name;
    }

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

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    @Override
    public void press() {
        //控制当前设备的开关
        status = !status;
    }
}

Lamp 类:吊顶类

public class Lamp extends JD{
    public Lamp(String name, boolean status) {
        super(name, status);
    }

}

WashMachine 类:洗衣机类

public class WashMachine extends JD{
    public WashMachine(String name, boolean status) {
        super(name, status);
    }
}

TV类:电视机类

public class TV extends JD{
    public TV(String name, boolean status ) {
        super(name, status);
    }
}

Air 类:冰箱类

public class Air extends JD{
    public Air(String name, boolean status) {
        super(name, status);
    }

}

Switch 接口:控制电器的开关

public interface Switch {
    void press(); //按压
}

SmartControl 类:单例类,智能控制系统

public class SmartControl {
    private static SmartControl instance = new SmartControl();
    private SmartControl(){}

    public static SmartControl getInstance(){
        return instance;
    }
     public void control(JD jd){
         System.out.println(jd.getName()+"开关状态:"+ (jd.isStatus()?"关":"开"));
         jd.press();
         System.out.println(jd.getName()+"开关已经:"+ (jd.isStatus()?"关":"开"));
     }

     //打印all 设备状态
    public  void printStatus(JD []jd){
        for (int i = 0; i < jd.length; i++){
            System.out.println((i + 1) +jd[i].getName()+"开关状态:"+ (jd[i].isStatus()?"关":"开"));
        }
    }
}

Test类:测试类

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        //目标:面向对象编程实现智能家居控制系统
        //角色:设备(吊灯,电视机,洗衣机,冰箱...)
        //设备功能:开关
        //谁控制:智能控制系统(单例对象)控制调用设备的开关

        //1.定义设备类:创建设备类
        //2.准备这些设备对象,放在对象数组中
        JD[] jds = new JD[4];
        jds[0] = new Lamp("吊灯",false);
        jds[1] = new TV("电视机",false);
        jds[2] = new WashMachine("洗衣机",false);
        jds[3] = new Air("冰箱",false);
        //3、为每个设备创建一个开关对象

        //4、创建智能控制系统类,并创建对象
        SmartControl sC = SmartControl.getInstance();


        Scanner sc = new Scanner(System.in);

        while (true){
            //打印设备状态
            System.out.println("--------------------------");
            sC.printStatus(jds);
            System.out.println("请输入设备编号:");
            int e = sc.nextInt();
            switch ( e){
                case 0:
                    return;
                case 1:
                    sC.control(jds[0]);
                    break;
                case 2:
                    sC.control(jds[1]);
                    break;
                case 3:
                    sC.control(jds[2]);
                    break;
                case 4:
                    sC.control(jds[3]);
                    break;
                default:
                    System.out.println("输入错误");
                    break;
            }
        }
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐