我需要创建新的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
?
答案 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
构造函数中的代码设置新局部变量的值,而不是类中的成员变量。