接口(Interface)
接口(Interface)是抽象方法和常量值的定义的合集,可以代替抽象类。
接口中可以定义的内容:
1.成员变量必须是一个常量值(接口中没有变量值,只有常量),格式: [public] [static] [final] 数据类型long 常量名=数据值;
2.封装的方法:
JDK8之前—抽象方法
[public] [abstract] 返回值类型 方法名(参数列表);
JDK8时—抽象方法,默认方法,静态方法
[public] default 返回值函数类型 方法名(参数列表){方法体};
[public] static 返回值类型 方法名(参数列表){方法体};
注意:接口中不能定义变量,也不能定义构造方法(等价于接口不能创建对象)也不能有静态代码快
//1.接口是一个特殊的抽象类
//2.interface 接口名 {}
//3.类实现接口用implements表示
// class 类名 implements 接口名 {}
//4.接口不能实例化 接口可以按照多态的形式来创建
//5.接口的子类 a:可以是抽象类 但是意义不大
// b:可以是具体类,实现所有的抽象方法(推荐的方案)
//多态:
// A:具体类多态(几乎没有)
// B:抽象类多态(很少)
// C:接口的多态(最常见)
//动物园
//定义动物训练的接口
interface AnimalTrain{
//抽象方法
public abstract void jump();
}
//抽象类实现接口 那抽象方法可以不用重写
abstract class Dog implements AnimalTrain{
}
//具体类
class Cat implements AnimalTrain{
@Override
public void jump() {
System.out.println("猫可以跳高了...");
}
}
public class Demo01 {
public static void main(String[] args) {
//接口不能new
//但是可以提供多态的方式来创建
//向上转型
AnimalTrain animalTrain=new Cat();
}
}
接口的特点
//接口的成员特点:
//构造方法: 接口没有构造方法
//成员变量: 只能是静态的常量
//默认加上修饰符 static final
//建议:大写手写出修饰符
//成员方法: 必须是抽象方法 abstract关键字可以不写,自动生成
//接口的变量是静态常量,所以不能改变
interface Inter{
// public static final int num = 10;
//
// public static final int num2 = 20;
//
// public static final int num3 = 30;
public int num=10;
public final int num2=20;
public static final int num3=30;
//抽象方法 abstract关键字可以不写,自动生成
public void show();
}
class InterImpl implements Inter{
@Override
public void show() {
}
}
public class Demo02 {
public static void main(String[] args) {
System.out.println(Inter.num);
//The final field Inter.num cannot be assigned
//Inter.num=30;
System.out.println(Inter.num2);
System.out.println(Inter.num3);
}
}
接口的关系
类与类: 继承关系 单继承,但是可以多层继承
类与接口:
实现关系: 可以单实现,也可以多实现 并且可以在继承一个类的基础上实现多个接口
接口与接口关系:
继承关系,可以单继承,也可以多继承
interface Mother{
public void show();
}
interface Father{
public void hello();
}
interface Daughter extends Mother,Father{
}
class Son extends Object implements Mother,Father{
@Override
public void show() {
}
@Override
public void hello() {
}
}
抽象类和接口的区别
抽象类:
成员变量:可以是常量,可以是变量
构造方法:有
成员方法:可以是抽象的,也可以是非抽象的
接口:
成员变量:只能是静态的常量
成员方法:只能是抽象方法
类与类:继承关系 单继承,但是可以多层继承
类与接口:实现关系 可以单实现,也可以多实现
接口与接口:继承关系,可以单继承,也可以多继承
默认方法
默认default修饰,不可以省略,供子类调用或者重写
interface Person{
public void hello();
//默认方法
public default void method() {
System.out.println("method");
}
}
class PersonIml implements Person{
@Override
public void hello() {
System.out.println("你好");
}
}
public class PersonDemo {
public static void main(String[] args) {
Person person=new PersonIml();
person.hello();
person.method();
}
}
静态方法
interface Person{
public void hello();
//默认方法
public default void method() {
System.out.println("method");
}
//静态方法
public static void method2() {
System.out.println("我是接口的静态方法...");
}
}
class PersonIml implements Person{
@Override
public void hello() {
System.out.println("你好");
}
}
public class PersonDemo {
public static void main(String[] args) {
Person person=new PersonIml();
person.hello();
person.method();
//静态方法 可以通过接口直接调用
Person.method2();
}
}
私有方法
可以在接口中编写私有的方法,然后拿给默认方法来调用
//jdk9 私有方法
// private void method5() {
// System.out.println("aaaa");
// }
//
// public default void method3() {
// method5();
// }