接口
概述
一系列方法的声明,一些方法特征的集合。一个接口只有方法特征没有方法的实现,这些方法可以在不同地方被不同类实现。
特点
1、interface 表示
2、格式:interface 接口名{}
实例化
多态实现。
实现接口的类
A:抽象类(意义不大)
B:具体类(必须重写所有抽象方法)
成员特点
1、成员变量
只能是静态常量,默认:public static finial
2、构造方法
无。
3、成员方法
只能是抽象方法(1.8之前)。
抽象方法、default(默认方法)、static(静态方法)------1.8之后
default:自动继承、直接调用。
static:接口名.方法名。
代码案例:
interface Person{
void eat();
void sleep();
/**
* 接口的默认方法,获取人体的BMI指数
* @param height 米
* @param weight 公斤
* @return
*/
default float getBMI(float height, float weight) {
return weight / (float)Math.pow(height, 2);
}
}
class Student implements Person{
@Override
public void eat() {
System.out.println("学生去食堂吃饭");
}
@Override
public void sleep() {
System.out.println("学生去宿舍睡觉");
}
}
class Parent implements Person{
@Override
public void eat() {
System.out.println("家长回家吃饭");
}
@Override
public void sleep() {
System.out.println("家长回家睡觉");
}
}
public class InterfaceSample {
public static void main(String[] args) {
Person student = new Student();
student.eat();
student.sleep();
//调用接口的默认方法
float bmi = student.getBMI(1.83F, 100);
System.out.println("student的BMI指数 = " + bmi);
System.out.println("==============================");
Person mom = new Parent();
mom.eat();
mom.sleep();
System.out.println("mom的BMI指数 = " + mom.getBMI(1.60F, 50));
}
}
}
其中,Person是一个人类接口,定义了两个普通方法和一个默认方法。而它的子类Student和Parent都必须实现普通方法,默认方法自动继承了,可直接调用。
最后的结果如下:
接口与抽象类的区别
A:成员区别
1、成员变量
抽象类:可变量,可常量。
接口: 只能是静态常量。
2、构造方法
抽象类:有。
接口:无。
3、成员方法
抽象类:可以抽象、可以非抽象
接口:default(默认方法)、static(静态方法)、抽象方法
B:关系区别
1、类与类:单继承,多层继承
2、类与接口:单/多 实现。
3、接口与接口:单/多继承。
C:理念
A:抽象类:“is a” 继承体系的共性功能
B:接口:“like a” 继承体系的拓展功能
jdk9新特性
在Interface中编写私有方法时,我们应该遵循以下规则:
- **我们应该使用私有修饰符(private)来定义这些方法。
- 我们不能同时使用私有修饰符(private)和abstract来定义这些方法。
“私有”方法意味着完全实现的方法,因为子类不能继承并覆盖此方法。
“抽象”方法意味着无实现方法。这里子类应该继承并覆盖此方法。 - 私有方法必须包含方法体,必须是具体方法。
- 这些接口私有方法仅在该接口内是有用的或可访问的。我们无法从接口访问或继承私有方法到另一个接口或类。
总结:Java9为我们提供的新功能——在接口中定义私有方法,对我们有很大的帮助,这将减少重复代码,提高代码的重用性,同时将私有方法写在接口中,不让子类看到,有很好的安全性。