是否每次创建到类的新链接时只需要此类的一个实例?

时间:2012-04-13 15:02:42

标签: java oop

例如,有一个类Warrior有链接类Sword。在类Sword定义的字段中:public static int hp = 100;它显示了这种武器消耗的健康点。需要一些Warrior课程。我想我需要在类Warrior中定义链接Sword(只有一次)才能获得静态字段hp。我该如何正确链接?

class public Warrior{
    public String name;
    public Sword s = new Sword(); // ???
}
class public Sword{
    public static int hp = 100;

}

每次新战士创建时,new Sword()会创建到课程的链接吗? 我可以在另一个Weapon类中将Sword类定义为static吗? (需要像Sword这样的多个类)


以下结构是否正确?外部类可以是静态的并且保持在另一个静态内部吗?

class public Warrior{
        public String name;

        public int SwordHp = Weapon.Sword().hp;
        public int BowHp = Weapon.Sword().hp;

    }

(abstract?) public static class Weapon{
    public static class Sword{
        public static int hp = 100;

    }
    public static class  Bow{
        public static int hp = 90;

    }

5 个答案:

答案 0 :(得分:2)

我不确定你到底想要什么,但正如你现在的代码示例一样,Warrior的构造会导致剑的构造。

这取决于“消耗的健康点”的含义。如果你想跟踪这种类型武器造成的所有伤害,你就可以使用静态HP场。如果这是你想要的,我建议使用一个跟踪所有统计数据的系统。像这样:

Statistics.getStatisticsForPlayer(playerName). // Get the statistics for a player
  increaseValue("damage_caused_by_sword", extraDamage); // increase that property

如果你想跟踪每把剑的健康点(这看起来对我来说最真实,因为剑永远不是锋利的),你应该创建非静态场。这使得该字段成为每个Sword实例的属性。

答案 1 :(得分:2)

是的,每次你都会得到一把新剑。

但是,因为hp是静态字段,所以只能获得其中一个。

请查看此链接以获取更多信息: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

答案 2 :(得分:1)

如果hpstatic,则根本不需要成员Sword。您可以使用Sword.hp访问该字段。

答案 3 :(得分:1)

要获取静态字段hp,您无需创建

public Sword s = new Sword();

在战士班。静态变量在加载时初始化。因此,只需使用

即可在任何地方访问hp,而无需在特定类中声明

Sword.hp;

这对静态变量没有任何影响。

 Sword s = new Sword()

据我了解你有一个战士和不同的武器,如目前的Sword.Every武器有健康点hp和每个Warior有自己的武器和健康点。如果你使用静态字段,那么这些健康点将在所有战士之间共享,如果有50个老人,那么所有人只会使用100点来收集我希望你不想要的,所以你应该使用:

class public Warrior{
    public String name;
    public Sword s = new Sword(); // ???
}
class public Sword{
    public  int hp = 100;

}

每次创造一个战士并且每个战士将消耗他自己的健康点时,它将创造一个具有100个生命值的新剑。希望它会有所帮助。

答案 4 :(得分:1)

如果武器类型的数量是常数,那么枚举就可以正常工作。

enum Weapon {
   Sword(100),
   Bow(90);

   private final int hp;
   private Weapon(int hp) {
      this.hp = hp;
   }

   int getHp();
}

public class Warrior {
   public String name;
   public Weapon weapon = Weapon.Sword;
}