3 接口
3.1 接口的介绍
- 接口 : 如果一个类中都是抽象方法 , 那么这个类应该是定义规则的类 , 我们应该把此类定义成接口,接口是一种引用数据类型
- 作用 :
- 用于定义规则
- 程序的扩展性
3.2 接口的定义和特点
- 定义接口的关键字使用interface
- public interface 接口名{ … }
- 类与接口之间的关系是实现关系 , 用关键字implements进行连接
- public class 类名 implements 接口名 { … }
- 接口不能实例化
- 接口的子类我们叫做实现类
- 要么重写接口中所有的抽象方法
- 要么实现类是一个抽象类
- 注意 : 类与接口的关系是实现关系 , 一个类可以实现多个接口,调用逗号分隔 , 还可以继承一个类的同时 , 实现多个接口
package com.itheima.interface_demo; public interface Inter { public abstract void show(); public abstract void method(); } interface Inter2 { }
package com.itheima.interface_demo; public class InterImpl extends Object implements Inter ,Inter2{ @Override public void show() { } @Override public void method() { } }
package com.itheima.interface_demo; /* 1 定义接口的关键字使用interface public interface 接口名{ ... } 2 类与接口的关系是实现关系 , 使用implements进行连接 public class 类名 implements 接口名{ ... } 3 接口不能实例化(不能创建对象) 4 接口的子类,我们叫做实现类 要么重写接口中所有的抽象方法 要么这个实现类是一个抽象类 注意 : 类与接口的关系是实现关系 , 一个类可以实现多个接口 还可以继承一个类的同时 , 实现多个接口 */ public class InterfaceDemo1 { public static void main(String[] args) { // 接口不能实例化(不能创建对象) // Inter inter = new Inter(); } }
3.3 接口的成员特点
- 成员变量 : 都是常量 , 默认修饰符 public static final
- 构造方法 : 没有构造方法
- 成员方法 : 只能是抽象方法 , 默认修饰符public abstract
- 关于JDK8和JDK9版本对接口增加了一些方法新特性
package com.itheima.interface_demo; public interface Inter { // 是一个常量 , 默认修饰符 public static final public static final int num = 10; // 不存在构造方法 // public Inter(){} public abstract void show(); public abstract void method(); } interface Inter2 { }
public class InterfaceDemo1 { public static void main(String[] args) { // 接口不能实例化(不能创建对象) // Inter inter = new Inter(); // 成员变量被static修饰 System.out.println(Inter.num); // 是一个常量 , 只能赋值一次 // Inter.num = 20; } }
3.4 接口的案例
package com.itheima.interface_demo.interface_test; public interface player { public abstract void play(); public abstract void pause(); public abstract void stop(); }
package com.itheima.interface_demo.interface_test; public class MP3 implements player { @Override public void play() { System.out.println("MP3开始播放音乐"); } @Override public void pause() { System.out.println("MP3开始暂停"); } @Override public void stop() { System.out.println("MP3开始关闭音乐"); } }
package com.itheima.interface_demo.interface_test; public class MP4 implements player { @Override public void play() { System.out.println("MP4播放音乐"); } @Override public void pause() { System.out.println("MP4暂停音乐"); } @Override public void stop() { System.out.println("MP4关闭音乐"); } }
package com.itheima.interface_demo.interface_test; /* 需求 : 1 创建一个播放接口 player 2 定义三个抽象方法 , 播放(play),暂停(pause),停止(stop) 3 定义MP3类,MAP4类,手机类,实现接口,重写抽象方法 */ public class PlayerTest { public static void main(String[] args) { MP3 mp3 = new MP3(); mp3.play(); mp3.pause(); mp3.stop(); System.out.println("============="); MP4 mp4 = new MP4(); mp4.play(); mp4.pause(); mp4.stop(); } }
3.5 接口中成员方法的特点
DK8版本之前 : 只能是抽象方法
JDK8版本 :
默认方法
JDK8可以在接口中定义非抽象方法(带有方法体的方法) , 需要使用default进行修饰 , 其实就是默认方法
作用 : 解决接口升级的问题
格式 : public default 返回值类型 方法名(参数) { … }
注意事项
默认方法不是抽象方法 , 可以继承 , 也可以重写 , 重写需要去掉default关键字
public 可以省略 , default不能省略
如果实现类实现了多个接口 , 有相同的方法声明 , 那么实现类必须重写该方法
静态方法
JDK8可以在接口中定义静态方法 , 也是有方法体的方法
作用 : 方便调用此功能
格式 : public static 返回值类型 方法名(参数){ … }
注意事项
静态方法只能通过接口名调用 , 不能通过实现类名字和对象调用
public可以省略 , static不能省略
JDK9版本 :
私有方法
JDK9中新增私有方法
作用 : 抽取默认方法中共性内容
格式 : private 返回值类型 方法名(参数){ … }
注意 : 要想抽取静态方法中的共性内容 , 需要对私有方法加上关键字static
4 枚举
枚举 : 当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型
作用 : 更贴切 , 加见名之意
定义 : public enum 枚举名{ … }
使用 : 通过枚举类型名直接引用枚举项即可,例如Sex.BOY、Sex.GIRL
注意 : 每个枚举项都相当于枚举的对象
案例代码
package com.itheima.enum_demo; public enum Sex { // 每一个枚举项都是枚举的对象 GIRL("女孩"), BOY("男孩"), YAO; // 成员变量 private String name; // 空参构造方法 private Sex() { } // 有参构造方法 private Sex(String name) { this.name = name; } // 成员方法 public String getName() { return name; } } class Test { public static void main(String[] args) { System.out.println(Sex.GIRL.getName()); System.out.println(Sex.BOY.getName()); System.out.println(Sex.YAO.getName()); } }
枚举其实本质上是一个类,每一个枚举项是本枚举类类型的一个对象。我们可以使用JDK提供的反编译命令,将枚举的字节码进行反编译查看
枚举本质上就是最终类
枚举项,就是枚举类的对象,而且是静态的常量。
有私有的构造方法
静态代码块
继承了lang包下的Enum
组成部分 :
构造器,成员方法,成员变量等 , 但是定义的成分一定要在枚举项之后,而且最后一个枚举项必须要有分号结束。