嵌套静态类不能返回其静态字段

时间:2012-04-14 16:12:30

标签: java oop

我需要创建新的warrior,指定名称,并使用GameCahracter类中指定的函数获取他的描述。当我尝试投放时 - 它会在显示weapon.type ; // <<Exception的{​​{1}}停止。为什么?据我所知,warrior构造函数分配给变量weapon=null一个指向新Weapon.Sword的链接。然后使用变量武器我应该能够访问它的字段weapon。这有什么不对?


type

abstract class GameCahracter{
    public String name;
    public String type;
    public Weapon weapon; 
    public int hitPoints;

    public String getDescription(){
        return  name + "; " + 
        type + "; "  + 
        hitPoints + " hp; " + 

        weapon.type ; // << Exception
    }

    public static class Warrior extends Player{
        public Warrior() {
            type = "Warrior";
            hitPoints = 100;
            Weapon.Sword weapon = new Weapon.Sword(); 
    }
}

abstract class Player extends GameCahracter {

}

 abstract class Weapon {
    public int damage;
    public String type = "default";

    public int getDamage(){
        return this.damage;
    }

    public static class Sword extends Weapon{

        public Sword() {

            String type = "Sword";
            int damage = 10; 
        }

    }
}

EDIT1

出于某种原因,我在打印GameCahracter.Warrior wr = new GameCahracter.Warrior(); wr.setName("Joe"); System.out.println( wr.getDescription()); 时遇到default字符串。为什么?如何让weapon.type成为type

3 个答案:

答案 0 :(得分:3)

你的问题在这一行:

Weapon.Sword weapon = new Weapon.Sword(); 

您使用本地变量隐藏您的成员变量。

将其替换为:

this.weapon = new Weapon.Sword(); 

答案 1 :(得分:2)

此时,您的构造函数会将weapon字段留给null。只需创建一个曾经超出范围的Sword实例。

所以改变行

Weapon.Sword weapon = new Weapon.Sword(); 
使用

Warrior构造函数中

weapon = new Weapon.Sword(); 

或更好

this.weapon = new Weapon.Sword(); 

并且在编写

时在Sword构造函数中执行了类似的错误
String type = "Sword";
int damage = 10; 

更改它们
this.type = "Sword";
this.damage = 10; 

答案 2 :(得分:1)

您会在该行获得异常,因为weapon实例中的变量GameCahracter为空。设置它的任何地方都没有代码。 Warrior构造函数中的代码设置新局部变量的值,而不是类中的成员变量。