【问题标题】:Initialising a variable of an object stored in an Array初始化存储在数组中的对象的变量
【发布时间】:2020-03-26 00:06:32
【问题描述】:

背景

我已经声明了一个名为villainCharacteristics 的二维数组。每代表一个不同的反派。 它由 3 列(整数类型)组成,表示 HPBulletDamageFireWeakness 的战斗值。

Villains类封装了这3个战斗变量,包括 设置器,以便为它们分配值。

我正在尝试什么

我尝试使用for 循环将具有战斗值的每一行从数组分配给不同的反派,因此我实例化了 5 个数组行和 5 个反派对象。

预期结果

为了澄清,一个例子是:

恶棍1,其HP应为 02bulletDamage1fireWeakness

问题及代码

但是,当尝试打印这些值时,它不起作用。

    public class WesternStory {

            //setting characteristics to each villain

            public static void main(String[] arguments) {
                int[][] villainCharacteristics = {{0,1,1}, 
                                                  {5,2,1},
                                                  {10,3,2},
                                                  {15,4,2},
                                                  {20,5,3}};


                Villains[] villainArray = new Villains[5]; //instantiated an array of 5 villain objects
                for(int i = 0; i < villainArray.length; i++){
                    villainArray[i] = new Villains();
                }


                for(int i = 0; i < 5; i++) { //initialises the different combat variables from the 2D array to each villain.
                    villainArray[i].setHP = villainCharacteristics[i][0]; //I get an error here
                    villainArray[i].setBulletDamage = villainCharacteristics[i][1]; //error
                    villainArray[i].setFireWeakness = villainCharacteristics[i][2]; //error

    System.out.println(villainArray[0].fireWeakness); //trying to print the value of fireWeakness within the first stored villain object.
                    }

Source code of Class Villains
public class Villains {
    //attacking variables: 
    private int hp;
    private int bulletDamage;
    private int fireWeakness;
    private int coins;

    //attack getters
    public int getHp(){
        return hp;
    }
    public int getBulletDamage(){
        return bulletDamage;
    }
    public int getFireWeakness(){
        return fireWeakness;
    }
    public int getCoins() {
        return coins;
    }


    //attack setters
    public void setHp(int hp){
        this.hp = hp;
    }
    public void setBulletDamage(int bulletDamage){
        this.bulletDamage = bulletDamage;
    }
    public void setFireWeakness(int fireWeakness){
        this.fireWeakness = fireWeakness;
    }


【问题讨论】:

  • 调用方法的语法是variable.method(arguments)。不是variable.method = arguments
  • 如果it doesn't work,你能解释一下你得到了什么错误信息吗?它是编译还是有警告/错误?然后我们需要知道它们,以及Villains类的源代码。
  • 增加了Class Villains的源代码。 @hc_dev

标签: java arrays loops object iteration


【解决方案1】:

您没有真正调用您的“设置”方法。例如,Villains.setHP 是一个函数,而不是一个属性,所以你必须像villain.setHP(7) 那样使用参数来调用它。下面是 for 循环的外观:

for(int i = 0; i < 5; i++) { 
  villainArray[i].setHP(villainCharacteristics[i][0]); 
  villainArray[i].setBulletDamage(villainCharacteristics[i][1]);
  villainArray[i].setFireWeakness(villainCharacteristics[i][2]); 
  System.out.println(villainArray[0].getFireWeakness());
}

当您尝试使用villain.setHP = 7 对其进行设置时,您似乎正在尝试将类的setHP 属性从一个方法更改为一个值,这当然不是您想要的。

【讨论】:

  • 封装:属性fireWeakness具有私有访问权限!
  • 是的,我编辑了它 - 你应该使用 getFireweakness() 来获取值
【解决方案2】:

编译错误

很遗憾你没有回答,但很明显,对于以下行:

villainArray[i].setHP = villainCharacteristics[i][0];

使用 java 编译时收到以下错误:

无法解析符号“setHP”

这是因为 Java 编译器会查找属性(属性、变量)符号 setHP。查看类显示setHP 不是属性的名称,而是方法(setter)。因此,它必须以不同的方式使用(即作为方法调用)才能成功编译。

如何使用二传手

Setter 是方法,使用要分配的值作为参数。 Java 方法在其名称后使用 括号 调用,在这些括号内以逗号分隔的形式传递所有参数。

因此,您应该调用 setter(即方法 setHP)而不是 villainArray[i].setHP = villainCharacteristics[i][0];,并调用要分配的值(即 villainCharacteristics[i][0]),如下所示:

villainArray[i].setHP(villainCharacteristics[i][0]);

如何使用getter

Getter 也是返回属性(变量)值的方法。因此,这些方法只是通过它们的名称和括号(不带参数)来调用。

例如,要获取返回值以进行打印,您应该调用 getter getFireWeakness()

System.out.println(villainArray[0].getFireWeakness());

您在循环中发布的代码行:

  System.out.println(villainArray[0].fireWeakness);

将打印失败并出现编译错误:

'fireWeakness' 在'Villains' 中拥有私人访问权限

这是因为尝试直接访问 private 属性(变量)是不允许的,只能通过 public getter:getFireWeakness()

另见

Java Encapsulation and Getters and Setters上的教程

【讨论】:

    【解决方案3】:

    所以你的问题就在那里:

    villainArray[i].setHP = villainCharacteristics[i][0]; //I get an error here
    villainArray[i].setBulletDamage = villainCharacteristics[i][1]; //error
    villainArray[i].setFireWeakness = villainCharacteristics[i][2]; //error
    

    setBulletDamage setFireWeakness 是方法调用,因此您必须向它们传递一个预期的参数,因为您已做出声明,从而收到编译错误。

    试试:

    villainArray[i].setHP = villainCharacteristics[i][0]; 
    villainArray[i].setBulletDamage(villainCharacteristics[i][1]); 
    villainArray[i].setFireWeakness(villainCharacteristics[i][2]);
    
    

    【讨论】:

    • 您是否测试了建议的代码:villainArray[i].setHP = villainCharacteristics[i][0];? OPs 类WesternStory 包含4 个Cannot resolve symbol 类型的编译错误。顺便说一句:您可以通过更好的格式改进您的帖子。
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多