学习内容:三种引用类型用法
一、类作为成员变量二、接口作为成员变量三、接口作为方法参数和返回值类型实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方式。基本类型可以作为成员变量、作为方法的参数、作为方法的返回值,那么当然引用类型也是可以的。
一、类作为成员变量
首先我们创建一个英雄Hero对象,使用 String 类型表示姓名、int类型表示年龄。此时, String 本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。现在我们想要继续丰富这个类的定义,给Hero增加装备Weapon。代码示例如下:
public class Hero {private String name; // 英雄名字private int age; // 英雄的年龄private Weapon weapon; // 武器public Hero() {}public void attack() {System.out.println("年龄为" + age + "的" + name + "用" + weapon.getCode() + "攻击敌方");}public Hero(String name, int age, Weapon weapon) {this.name = name;this.age = age;this.weapon = weapon;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Weapon getWeapon() {return weapon;}public void setWeapon(Weapon weapon) {this.weapon = weapon;}}
我们再创建一个武器Weapon类,定义武器的名字:
public class Weapon {private String code; // 武器的代号public Weapon() {}public Weapon(String code) {this.code = code;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}}
最后编写一个测试类,给英雄设置年龄姓名属性,并且给它武器。再在Hero类中添加一个攻击的方法Attack():
public class DemoMain {public static void main(String[] args) {// 创建一个英雄角色Hero hero = new Hero();// 为英雄起一个名字,并且设置年龄hero.setName("男枪");hero.setAge(20);// 创建一个武器对象Weapon weapon = new Weapon("幕刃");// 为英雄配备武器hero.setWeapon(weapon);hero.attack(); // 年龄为20的男枪用幕刃攻击敌方}}
测试类执行的结果如图:
二、接口作为成员变量
接口是对方法的封装,对应游戏当中,可以看作是扩展游戏角色的技能。所以,如果想扩展更强大技能,我们在Hero中,可以增加接口作为成员变量,来设置不同的技能。下面进行代码演示:
还是首先创建一个Hero类,其中除了英雄的名字外,再定义一个接口Skill作为成员变量:
public class Hero {private String name;private Skill skill;public Hero() {}public void attack() {System.out.println("我叫" + name + ",开始释放技能:");skill.use(); // 调用接口中的抽象方法System.out.println("释放技能完成");}public Hero(String name, Skill skill) {this.name = name;this.skill = skill;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Skill getSkill() {return skill;}public void setSkill(Skill skill) {this.skill = skill;}}
然后我们来创建这个接口,定义一个释放技能的方法:
public interface Skill {void use();}
最后我们来定义一个测试类,在Hero类中定义一个attack方法,该方法调用接口中释放技能的方法use(),在测试类中使用匿名内部类和匿名对象来设置英雄技能:
public class DemoGame {public static void main(String[] args) {Hero hero = new Hero();hero.setName("艾希"); // 设置英雄的名称// 设置英雄技能// hero.setSkill(new SkillImpl()); // 使用单独定义的实现类// 还可以改成使用匿名内部类Skill skill = new Skill() {@Overridepublic void use() {System.out.println("眩晕");}};hero.setSkill(skill);// 进一步简化,同时使用匿名内部类和匿名对象hero.setSkill(new Skill() {// 匿名内部类和匿名对象@Overridepublic void use() {System.out.println("减速");}});hero.attack();}}
三、接口作为方法参数和返回值类型
当接口作为方法的参数时,需要传递什么呢?当接口作为方法的返回值类型时,需要返回什么呢?对,其实都是它的子类对象。 ArrayList 类我们并不陌生,查看API我们发现,实际上,它是 java.util.List 接口的实现类。所以,当我们看见 List 接口作为参数或者返回值类型时,当然可以将 ArrayList 的对象进行传递或返回。
下面用一段代码来简单演示:
import java.util.ArrayList;import java.util.List;/*java.util.list正是ArrayList所实现的接口。*/public class DemoInterface {public static void main(String[] args) {// 左边是接口名称,右边是实现类名称,这就是多态写法List<String> list = new ArrayList<>();List<String> result = addNames(list);for (int i = 0; i < result.size(); i++) {System.out.println(result.get(i));}}public static List<String> addNames(List<String> list) {list.add("nxy");list.add("jhn");list.add("wky");list.add("dzy");return list;}}
重学Java(035)——Java基础知识(类作为成员变量 接口作为成员变量 接口作为方法参数和返回值类型)