Java学习笔记(33)—— 接口

  • Post author:
  • Post category:java


这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。


一、接口

1.1 概述


  • 接口的作用:结构设计工具,用来解耦合、隔离实现

  • 可以理解为,接口是极端的抽象类





interface


代替


class





implements


代替


extends


1.2 接口中只能定义


  • 公开的常量

  • 公开的抽象方法

  • 公开的内部类、内部接口


1.3 类可以实现多个接口


  • 一个类只能有一个父类,但可以实现多个接口


class A implements X,Y,Z {


}


class A extends B implements X,Y,Z {


}


1.4接口之间继承,可以继承多个


interface A extends X,Y,Z {


}


1.5 练习:变形金刚


在此,我们先定义一个“武器”接口,同时将武器的一般通用功能或特点抽象为接口方法,例如kill(), getName(), getType()。

package 接口_变形金刚;
/*
 *	定义接口,主要就是定义抽象方法 
 */
public interface Weapon {
	// public static final,在接口中可以省略不写
	// 定义公开的常量
	public static final int TYPE_COLD = 0;
	public static final int TYPE_HOT = 1;
	public static final int TYPE_NUCLEAR = 2;
	
	/*接口定义的抽象方法*/
	// 接口中定义的方法默认是public abstract,可以省略不写
	void kill();
	String getName();
	int getType();
}

完成了接口的定义,接下来,我们来创造具体的武器,例如刀剑、枪炮、棍棒等。

package 接口_变形金刚;
/*
 *	武器:剑(鲨齿剑) 
 */
public class Sword implements Weapon{

	@Override
	public void kill() {
		System.out.println("横贯八方!");
	}

	@Override
	public String getName() {
		return "鲨齿剑";
	}

	@Override
	public int getType() {
		return Weapon.TYPE_COLD;
	}
}
package 接口_变形金刚;

public class AK47 implements Weapon {
	@Override
	public void kill() {
		System.out.println("当!当当当!");
	}

	@Override
	public String getName() {
		return "银狐狙击炮!";
	}

	@Override
	public int getType() {
		return Weapon.TYPE_HOT;
	}
}
package 接口_变形金刚;

public class Lyb implements Weapon {
	@Override
	public void kill() {
		System.out.println("打狗!");
	}

	@Override
	public String getName() {
		return "打狗棒";
	}

	@Override
	public int getType() {
		return Weapon.TYPE_NUCLEAR;
	}
}

至此,我们已经创建了3个具体武器,并且实现了相应的“武器”应该具备的方法。换句话说,我们已经完成了接口和接口实现类的编写,接下来就是怎么使用它们了。

我们接下来开始编写“变形金刚”,并且把设计的接口使用起来。

package 接口_变形金刚;
/*
 *	变形金刚使用Weapon接口 
 */
public class Transformer{
	// 使用Weapon接口,则需要将Weapon定义为一个成员
	// w默认值是null
	private Weapon w;// 基于多态,三种武器都可以向上转型,保存在“父类”对象
	
	// 进攻
	public void attack() {
		System.out.println("金刚进攻!");
		// 判断是否有装配武器
		if(w == null) {
			System.out.println("用牙咬!");
			return;
		}
		
		// 有武器,将武器类别代码转换成字符串的类别名
		String s = "";
		switch(w.getType()) {
		case Weapon.TYPE_COLD: s = "冷兵器";break;
		case Weapon.TYPE_HOT: s = "热兵器";break;
		case Weapon.TYPE_NUCLEAR: s = "核武器";break;
		}
		
		// 显示进攻消息,例如:使用冷兵器鲨齿剑攻击!
		System.out.println("使用"+s+w.getName()+"攻击!");
		// 调用kill(),执行进攻动作
		w.kill();
	}
	
	// 人为设置武器对象
	public void setWeapon(Weapon w) {
		this.w = w;
	}
}

在此,我们将“武器”接口使用在了“变形金刚”类中,这样基于多态的原理,变形金刚就可以使用这个武器接口来“对接”多种武器实例,从而实现了解耦。接下来,我们测试一下。

package 接口_变形金刚;

import java.util.Random;
import java.util.Scanner;

public class Test1 {
	public static void main(String[] args) {
		// 创建变形金刚对象
		Transformer t = new Transformer();
		// 创建武器对象
		Sword s = new Sword();
		AK47 a = new AK47();
		Lyb l = new Lyb();
		
		System.out.println("回车继续!");
		
		while(true) {
			new Scanner(System.in).nextLine();
			// 随机武器类别
			int r = new Random().nextInt(4);
			// 依据随机类别,装配武器
			switch(r) {
			case 0: t.setWeapon(s);break;// 装配武器鲨齿剑,冷兵器
			case 1: t.setWeapon(a);break;// 装配武器银狐狙击炮,热兵器
			case 2: t.setWeapon(l);break;// 装配武器打狗棒,核武器
			case 3: t.setWeapon(null);break;// 默认无武器
			}
			// 变形金刚进攻
			t.attack();
		}		
	}
}



版权声明:本文为AlieNeny原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。