接口,什么时候用?当一个类中只有自定义常量和抽象方法时;
接口的案例
第一题
编写步骤:
- 定义接口A,普通类B实现接口A
- A接口中,定义抽象方法showA。
- A接口中,定义默认方法showB。
- B类中,重写showA方法
- 测试类中,创建B类对象,调用showA方法,showB方法
package com.atguigu.test01;
public class Test01 {
public static void main(String[] args) {
B b = new B();
b.showA();
b.showB();
}
}
interface A{
void showA();
default void showB(){
System.out.println("BBB");
}
}
class B implements A{
@Override
public void showA() {
System.out.println("AAA");
}
}
第二题
- 编写步骤
-
定义接口Universe,提供抽象方法doAnything。
-
定义普通类Star,提供成员发光shine方法,打印“star:星星一闪一闪亮晶晶"
-
定义普通类Sun,
继承Star类,重写shine方法,打印"sun:光照八分钟,到达地球"
实现Universe接口,实现doAnything,打印"sun:太阳吸引着9大行星旋转"
-
测试类中,创建Star对象,调用shine方法
-
测试类中,多态的方式创建Sun对象,调用doAnything方法,向下转型,调用shine方法。
package com.atguigu.test02;
public class Test02 {
public static void main(String[] args) {
Star s = new Star();
s.shine();
System.out.println("======================");
Universe u = new Sun();
u.doAnything();
Sun sun = (Sun) u;
sun.shine();
}
}
interface Universe{
void doAnything();
}
class Star{
public void shine(){
System.out.println("star:星星一闪一闪亮晶晶");
}
}
class Sun extends Star implements Universe{
@Override
public void shine(){
System.out.println("sun:光照8分钟到达地球");
}
@Override
public void doAnything() {
System.out.println("sun:太阳吸引着9大行星旋转");
}
}
第三题
- 模拟接待员接待用户,根据用户id,给用户分组。
- 定义用户类:
- 属性:用户类型,用户id
- 提供基本的构造方法和get方法,set方法
- 定义接口Filter:
- 提供抽象方法filterUser(User u)
- 定义实现类V1Filter,实现抽象方法,将用户设置为v1
- 定义实现类V2Filter,实现抽象方法,将用户设置为v2
- 定义实现类AFilter,实现抽象方法,将用户设置为A
- 定义接待员类Receptionist:
- 属性:接口Filter
- 提供基本的构造方法和get方法,set方法
- 成员方法:接待用户方法,设置用户类型。
- 测试类:
- 初始化15个User对象,id为1-15。
- 创建三个接待员对象。
- 第一个接待员,设置接待规则,将1-5号用户类型设置为v1。
- 第二个接待员,设置接待规则,将6-10号用户类型设置为v2。
- 第三个接待员,设置接待规则,将11-15号用户类型设置为A。
- 遍历数组,给用户分区。
- 代码实现,效果如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJLO4liq-1635857822327)(imgs/1559215024155.png)]
package com.atguigu.test05;
public class Test05 {
public static void main(String[] args) {
User[] all = new User[15];
for (int i = 0; i < all.length; i++) {
all[i] = new User(null,i+1);
}
V1Filter v1F = new V1Filter();
V2Filter v2F = new V2Filter();
AFilter aF = new AFilter();
Receptionist r1 = new Receptionist(v1F);
for (int i = 0; i < 5; i++) {
r1.recept(all[i]);
}
Receptionist r2 = new Receptionist(v2F);
for (int i = 5; i < 10; i++) {
r2.recept(all[i]);
}
Receptionist r3 = new Receptionist(aF);
for (int i = 10; i < 15; i++) {
r3.recept(all[i]);
}
for (int i = 0; i < all.length; i++) {
System.out.println(all[i]);
}
}
}
class User{
private String type;
private int id;
public User(String type, int id) {
super();
this.type = type;
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return id + "-" + type;
}
}
interface Filter{
void filterUser(User u);
}
class V1Filter implements Filter{
@Override
public void filterUser(User u) {
u.setType("v1");
}
}
class V2Filter implements Filter{
@Override
public void filterUser(User u) {
u.setType("v2");
}
}
class AFilter implements Filter{
@Override
public void filterUser(User u) {
u.setType("A");
}
}
class Receptionist{
private Filter filter;
public Receptionist(Filter filter) {
super();
this.filter = filter;
}
public Filter getFilter() {
return filter;
}
public void setFilter(Filter filter) {
this.filter = filter;
}
public void recept(User u){
if(u.getType() != null){
return ;
}
filter.filterUser(u);
}
}
第四题
案例:
1、声明可支付接口Payable:
包含抽象方法:void pay();
2、声明支付枚举类Payment:
(1)创建常量对象:支付宝(ALIPAY),微信(WECHAT),信用卡(CREDIT_CARD),储蓄卡(DEPOSIT_CARD)
(2)枚举类Payment实现接口Payable
①支付宝/微信:对接口的实现是打印“扫码支付”
②信用卡/储蓄卡:对接口的实现是打印“输入卡号支付”
3、在测试类中,获取所有支付对象,并调用它们的pay()
package com.atguigu.test03;
public class Test03 {
public static void main(String[] args) {
Payment[] values = Payment.values();
for (int i = 0; i < values.length; i++) {
values[i].pay();
}
}
}
interface Payable{
void pay();
}
enum Payment implements Payable{
ALIPAY{
@Override
public void pay() {
System.out.println("扫码支付");
}
},WECHAT{
@Override
public void pay() {
System.out.println("扫码支付");
}
},CREDIT_CARD,DEPOSIT_CARD;
@Override
public void pay() {
System.out.println("输入卡号支付");
}
}