任何一种数据类型都是可以作为成员变量类型的

1.类作为成员变量类型

成员变量不仅能用基本类型,还可以用任何一种类

类作为成员变量类型&接口作为成员变量类型_java

类作为成员变量类型&接口作为成员变量类型_匿名内部类_02

 可以看到FwAddressItem是一个类,可以作为成员变量类型。

类作为成员变量类型&接口作为成员变量类型_匿名内部类_03

 上面的Weapon就是一个类,weapon是一个对象

调用的时候

类作为成员变量类型&接口作为成员变量类型_匿名内部类_04

Hero.java

package cn.yjg.day10.demo03;

public class Hero {
    // 游戏当中英雄的角色
    private String name;   // 英雄名字

    private Weapon weapon;  // 武器

    private int age;        // 英雄年龄

    public Hero(){

    }

    public Hero(String name, Weapon weapon, int age) {
        this.name = name;
        this.weapon = weapon;
        this.age = age;
    }

    public void attack() {
        System.out.println("年龄为" + age + "的" + name +"正在用" + weapon.getCode() + "攻击对方!");
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Weapon getWeapon() {
        return weapon;
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Weapon.java

package cn.yjg.day10.demo03;

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;
    }
}

DemoMain.java

package cn.yjg.day10.demo03;

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();
    }
}

  运行结果:

类作为成员变量类型&接口作为成员变量类型_抽象方法_05

 2.接口作为成员变量类型

 Hero.java

public class Hero {
    private String name;   // 英雄的名称
    private Skill skill;   // 英雄的技能

    public Hero() {
    }

    public Hero(String name, Skill skill) {
        this.name = name;
        this.skill = skill;
    }

    public void attack() {
        System.out.println("我叫" + name + ",开始施放技能");
        skill.use();   // 调用接口中的抽象方法
        System.out.println("施放技能完成");
    }

    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;
    }
}

接口Skill

public interface Skill {
    public abstract void use();
}

 接口实现类SkillImpl.java

public class SkillImpl implements Skill {
    @Override
    public void use() {
        System.out.println("Biu~biu~biu~~~~");
    }
}

  DemoGame.java

public class DemoGame {
    public static void main(String[] args) {
        Hero hero = new Hero();
        hero.setName("艾希");   // 设置英雄的名称

        // 设置英雄的技能
        hero.setSkill(new SkillImpl());  // 使用单独定义的实现类
        hero.attack();
    }
}

  运行结果:

类作为成员变量类型&接口作为成员变量类型_抽象方法_06

 类作为成员变量类型&接口作为成员变量类型_抽象方法_07

 不用接口实现类,使用匿名内部类

类作为成员变量类型&接口作为成员变量类型_成员变量_08

 进一步简化,同时使用匿名内部类和匿名对象

 类作为成员变量类型&接口作为成员变量类型_抽象方法_09

 3.接口作为方法的参数和返回值

类作为成员变量类型&接口作为成员变量类型_接口实现_10

 类作为成员变量类型&接口作为成员变量类型_匿名内部类_11