Java面向对象之 接口: [修饰符] interface 接口名 {...};子接口:[修饰符] interface 接口名 extends 父接口,父接口2...{...}

1、什么是接口?

类比抽象类,把功能或者特性类似的一类 抽象的更彻底,可以提炼出更加特殊的“抽象类”----接口

 

2、如何定义接口

语法:

 [修饰符] interface 接口名 {

  N个常量定义...

  N个抽象方法定义...

  N个内部类、接口、枚举定义....

  N个私有方法,默认方法或者类方法定义

}

修饰符一般为public 即可以跨包访问,绝大多数情况接口都是需要跨包访问的

 3、接口特性注意:

  1. 接口修饰符public可以省略,省略后不能在包外访问,所以99%+ 实际应用中都是需要public

  2. 不支持变量定义,定义出来的变量都是常量。也就是说默认都是被隐藏的static、final修饰的类变量

    如下两行代码效果一样

    int maxNum = 10;
    public static final int maxNum = 10;
  3. 接口中定义的方法,认都是public (公开)、abstract  (抽象) 的。必须被类实现,

  4. java9接口中还可以定义默认方法。当实现类中没有重写方法的话,调用的就是这个默认方法。

  5. java9接口中还可以使用private的方法。这些private 的方法就是给默认方法充当工具方法的。

示例:图形接口

package com.zmd.study.interface_example;

/**
 * @ClassName Shape
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
 * date: 2021/3/30.
 */
public interface Shape {
    /**
     * 接口中定义的变量 默认为常量:自动被public static final 修饰
     * 如下mxNum变量的定义等于:public static final int maxNum = 10;
     */
    int maxNum = 10;
    //public static final int maxNum = 10;
    /**
     * 获取平面图形的类型
     */
    public abstract String getType();

    /**
     * 获取平面图形的周长
     */
    public abstract double getPerimeter();
}

三角形类实现接口

package com.zmd.study.interface_example;

/**
 * @ClassName Triangle
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 类实现了接口功能,使用implements关键字
 * date: 2021/3/30.
 */
public class Triangle implements Shape {
    /**
     * 三角形的三边长类型定义
     */
    private double a;
    private double b;
    private double c;

    /**
     * 构造方法,创建三角形实例必须提供三边长度
     */
    public Triangle(double a, double b, double c) {
        /**
         *@params [a, b, c] 三角形三边长度
         *@return null
         *@创建时间 2021/3/30
         */
        if(a+b < c || a+c < b || b+c < a){
            System.out.println("Failed!:三角形的两边之和必须大于第三边");
            return;
        }
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public String getType() {
        if(a+b < c || a+c < b || b+c < a){return "未知图形";}
        return "三角形";
    }

    @Override
    public double getPerimeter() {
        return a + b + c;
    }

}

测试运行

package com.zmd.study.interface_example;

/**
 * @ClassName InterfaceTest
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/3/30.
 */
public class InterfaceTest {
    public static void main(String[] args) {
        Shape triangle = new Triangle(3,4,5);
        System.out.println(triangle.getType());
        System.out.println(triangle.getPerimeter());
    }
}
/**
输出:
三角形
12.0
*/

4、接口的默认方法 default 修饰 (java 9新特性)

实现类中没有重写方法的话,调用的就是这个默认方法。

如上Shape.java中 增加default修饰的方法

package com.zmd.study.interface_example;

/**
 * @ClassName Shape
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
 * date: 2021/3/30.
 */
public interface Shape {
    ...同上省略
/** * 定义一个默认方法;如果实现接口的类没有写这个方法,也可以使用 */ default public void printMe(){ System.out.println("我是:" + getType() + "我的周长是:" + getPerimeter()); } }

三角形类同上:Triangle.java

测试类实例化三角形Triangle()调用printMe()方法

public class InterfaceTest {
    public static void main(String[] args) {
        Shape triangle = new Triangle(3,4,5);
        System.out.println(triangle.getType());
        System.out.println(triangle.getPerimeter());
        triangle.printMe();
    }
}
/**
三角形
12.0
我是:三角形我的周长是:12.0
/*

5、接口中的private的方法(java9新特性)

作用:完全是给default 默认方法充当工具方法,当有多个default方法有共同的代码的时候,可以单独列出来。

package com.zmd.study.interface_example;

/**
 * @ClassName Shape
 * @projectName: object1
 * @author: Zhangmingda
 * @description: 定义一个形状接口,用于三角形或其它图形类实现功能,或者子接口继承
 * date: 2021/3/30.
 */
public interface Shape {
    ...省略如上代码...

    /**
     * 定义一个默认方法;如果实现接口的类没有写这个方法,也可以使用
     */
    default public void printMe(){
        beforPrintMe();
        System.out.println("我是:" + getType() + "我的周长是:" + getPerimeter());
        
    }
    /**
     * java9 特性:接口可以用private 私有的方法,给default方法充当工具方法
     */
    private void  beforPrintMe(){
        System.out.println("beforPrintMe()....干了一些活");
    }
}

三角形类同上:Triangle.java

测试类实例化三角形Triangle()调用printMe()方法

package com.zmd.study.interface_example;

/**
 * @ClassName InterfaceTest
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/3/30.
 */
public class InterfaceTest {
    public static void main(String[] args) {
        Shape triangle = new Triangle(3,4,5);
        System.out.println(triangle.getType());
        System.out.println(triangle.getPerimeter());
        triangle.printMe();
    }
}
/**
三角形
12.0
beforPrintMe()....干了一些活
我是:三角形我的周长是:12.0
*/

 

 

6、子接口定义(接口的继承)

语法:

 [修饰符] interface 接口名 extends 父接口,父接口2...{

  ....同上

}

示例:

动物接口、人接口、女人接口;女人接口继承动物和人。wife 类实现女人接口。wife类就具有如上接口的default方法

动物接口

package com.zmd.study.interface_example;

public interface Animal {
    default void yell(){
        System.out.println("动物 啊....叫喊!!!");
    }
}

人接口

package com.zmd.study.interface_example;

public interface Person {
    default void makeLove(){
        System.out.println("Person makeLove 啊!...哦...啊...");
    }
}

女人接口

package com.zmd.study.interface_example;

public interface Woman extends Animal, Person{
}

wife类

package com.zmd.study.interface_example;
public class Wife implements Woman {
}

测试类

package com.zmd.study.interface_example;

public class InterfaceTest {
    public static void main(String[] args) {
        Wife wife = new Wife();
        wife.yell();
        wife.makeLove();
    }
}
/**
动物 啊....叫喊!!!
Person makeLove 啊!...哦...啊...
*/

7、一个类实现多个接口

用一个学生类实现6中的Animal、Person接口。并增加自己的功能

学生类Student.java

package com.zmd.study.interface_example;

public class Student implements Animal,Person  {
    public void study(){
        System.out.println("学习");
    }
}

测试类

package com.zmd.study.interface_example;

/**
 * @ClassName InterfaceTest
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/3/30.
 */
public class InterfaceTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.study();
        student.yell();
        student.makeLove();

    }
}

/**
学习
动物 啊....叫喊!!!
Person makeLove 啊!...哦...啊...
*/

 

 

 

 

 

 

 

 

 

 

 

 

其他类似案例场景

接口实现业务逻辑课插拔,更换数据库直接改配置文件即可。

 

posted on 2021-03-30 22:17  zhangmingda  阅读(1653)  评论(0编辑  收藏  举报

导航