引用類型用法

概述

實際的開發中,引用類型的使用非常重要,也是非常普遍的。我們可以在理解基本類型的使用方式基礎上,進一步去掌握引用類型的使用方式。

基本類型可以作爲成員變量、作爲方法的參數、作爲方法的返回值,那麼當然引用類型也是可以的。

類作爲成員變量

遊戲角色類

在定義一個類Role(遊戲角色)時,代碼如下:

package test.demo09;
// 英雄
public class Role {
    int id; // 角色ID
    int blood; // 生命值
    String name; // 角色名稱
}

使用int 類型表示角色id和生命值,使用 String 類型表示姓名。此時,string本身就是引用類型,由於使用的方式類似常量,所以往往忽略了它是引用類型的存在。

如果我們繼續豐富這個類的定義,給Role增加武器,穿戴裝備等屬性,我們將如何編寫呢?

武器類

定義武器類,將增加攻擊能力:

package test.demo09;
// 武器
public class Weapon {
    String name; // 武器名稱
    int hurt; // 傷害值
    
	// 省略構造器和get/set
}

護甲類

定義穿戴盔甲類,將增加防禦能力,也就是提升生命值:

package test.demo09;
// 護甲
public class Armor {
    String name; // 護甲名稱
    int protect; // 防禦值

    // 省略構造器和get/set
}

代碼實現

角色類

package test.demo09;
// 英雄
public class Role {
    int id; // 角色ID
    int blood; // 生命值
    String name; // 角色名稱

    // 添加武器屬性
    Weapon weapon;
    // 添加護甲屬性
    Armor armor;

    // 提供get/set方法
    public Weapon getWeapon() {
        return weapon;
    }

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

    public Armor getArmor() {
        return armor;
    }

    public void setArmor(Armor armor) {
        this.armor = armor;
    }

    // 攻擊方法
    public void attack() {
        System.out.println("Role使用"+ weapon.getName() +",造成"
                           + weapon.getHurt() +"點傷害");
    }
    // 穿戴護甲
    public void wear() {
        // 增加防禦,就是增加blood值
        this.blood += armor.getProtect();
        System.out.println("穿上"+ armor.getName() +",生命值增加"
                           + armor.getProtect());
    }
}

測試類

package test.demo09;

public class DemoMain {
    public static void main(String[] args) {
        // 創建Weapom對象
        Weapon w = new Weapon("AK-47",79);
        // 創建Armor對象
        Armor a = new Armor("防彈背心",35);
        // 創建Role對象
        Role r = new Role();

        // 設置武器屬性
        r.setWeapon(w);
        // 設置護甲屬性
        r.setArmor(a);

        // 攻擊
        r.attack();
        // 穿戴護甲
        r.wear();
    }
}

結果:

Role使用AK-47,造成79點傷害
穿上防彈背心,生命值增加35

接口作爲成員變量

接口是對方法的封裝,對應遊戲當中,可以看作是擴展遊戲角色的技能。所以,如果想擴展更強大技能,我們在RoleRole中,可以增加接口作爲成員變量,來設置不同的技能。

接口

  • 我們使用一個接口,作爲成員變量,以便隨時更換技能,這樣的設計更爲靈活,增強了程序的擴展性。

  • 接口作爲成員變量時,對它進行賦值的操作,實際上,是賦給該接口的一個子類對象。

定義接口和釋放技能的抽象方法

public interface Skill {

    void use(); // 釋放技能的抽象方法
}

角色類

public class Hero {

    private String name; // 英雄名稱
    private Skill skill; // 英雄技能

    public void attack() {
        System.out.println("我叫" + name + ",開始釋放技能");
//        new SkillImpl().use();
        skill.use(); // 調用接口中的抽象方法
        System.out.println("技能釋放完畢");
    }

	// 省略構造器和get/set
}

測試類

// 使用接口Skill接口作爲成員變量類型
public class DemoGame {

    public static void main(String[] args) {
        Hero hero = new Hero();
        hero.setName("夜玫瑰");

        // 1. 使用單獨定義的實現類
        hero.setSkill(new SkillImpl());
        hero.attack();
        System.out.println("=================");

        // 2. 還可以使用匿名內部類
        Skill skill = new Skill() {
            @Override
            public void use() {
                System.out.println("pia~ pia~ pia~");
            }
        };
        hero.setSkill(skill);
        hero.attack();
        System.out.println("=================");

        // 3. 進一步簡化,同時使用匿名內部類和匿名對象
        hero.setSkill(new Skill() {
            @Override
            public void use() {
                System.out.println("tu~ tu~ tu~");
            }
        });

        hero.attack();
    }
}

結果:

我叫夜玫瑰,開始釋放技能
Biu~ Biu~ Biu~
技能釋放完畢
=================
我叫夜玫瑰,開始釋放技能
pia~ pia~ pia~
技能釋放完畢
=================
我叫夜玫瑰,開始釋放技能
tu~ tu~ tu~
技能釋放完畢

接口作爲方法的參數和返回值

  • 接口作爲參數時,傳遞它的子類對象。

  • 接口作爲返回值類型時,返回它的子類對象。

代碼演示:

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));
        }
    }
    // List<String> list:進來的時候是空集合
    public static List<String> addNames(List<String> list) { 
        list.add("迪麗熱巴");
        list.add("古力娜扎");
        list.add("馬爾扎哈");
        return list;
    }
}

結果:

迪麗熱巴
古力娜扎
馬爾扎哈

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章