[英]Java: Referring to a Class inside its own method
我正在做一个正在尝试调试的任务。 我有很多error: (method name) in class (SuperClass Name) cannot be applied to given types;
。 该项目正在将针对过程编程的游戏改用于同一游戏,但现在针对OOP。 我是Java的新手,并负责创建许多类,其中有两个是Superclass的子类(很明显),并且为我提供了要使用的方法及其参数。 我遇到的问题是,子类中的一种方法应该控制玩家和敌人这两个角色之间的战斗。 这两个类都是字符类(超类)的子类。 由于这是一个班级任务,因此我不想发布所有内容,但以下是我尝试执行的战斗方法的示例。 我遇到,并继续在总体上有“ 继承 ”的问题,就是究竟是什么父/子类,以及如何通过他们每个人之间存在一定的值/变量之间的继承。
在下面的示例代码中,此方法嵌套在扩展Character
类的Player
类中。 此方法需要使用Enemy
类中的Enemy
并执行其中的动作。 根据结果,我将布尔值传递回程序的main方法。
我的问题是 我不确定在本例中如何在已经包含在“ Player
”类下的方法内调用已成为“ Player
”类的类。 要求我在调用该方法时使用一个参数Enemy
。 我很肯定我没有以适当的方式来处理这个特定的任务,并且有更好的方法来处理这个问题。 但是,非常感谢您了解所有可能的帮助,因为这将帮助我以正确的方式完成这项任务。
Player
类的示例方法如下:
public abstract class Character{ //Character Superclass - attack method called
public int attack(Player _player){
Random randomNumbers = new Random();
int enemyRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage;
int enemyAtk = enemyRandAtk + getStrength();
int charRemainingHP = _player.getHitPoints() - enemyAtk; //can I call _player in the Character class????
System.out.printf("%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), enemyRandAtk, enemyAtk);
System.out.printf("%s HP is now %d - %d = %d\n\n", _player.getName(), _player.getHitPoints(), enemyAtk, charRemainingHP);
return charRemainingHP;
}
public class Player extends Character{
public int attack(Enemy _enemy){
Random randomNumbers = new Random();
int enemyHP = _enemy.getHitPoints();
int charRandAtk = randomNumbers.nextInt(Weapon.getMaxDamage - Weapon.getMinDamage) + Weapon.getMinDamage;
int charAtk = charRandAtk + getStrength();
int enemyRemainingHP = _enemy.getHitPoints() - charAtk;
System.out.printf("\n\n%s attacks with ATK = %d + %d = %d\n", getName(), getStrength(), charRandAtk, charAtk);
System.out.printf("%s HP is now %d - %d = %d\n\n", _enemy.getName(), enemyHP, charAtk, enemyRemainingHP);
return enemyRemainingHP;
}
public boolean battleWizard(Enemy _enemy){
Random randomNumbers = new Random();
Scanner userInput = new Scanner(System.in);
int spellCast = randomNumbers.nextInt(4) + 1;
System.out.printf("*** %s vs The Evil Wizard ***\n\n", getName()); //getName() is in Player Class
boolean charWinning = false;
int updWizHP = _enemy.getHitPoints(); //****** Question 1. below
do{
System.out.print("Choose your action: \n" +
"1. Attack\n" +
"2. Attempt Spell Cast\n\n" +
"What would you like to do?: ");
int battleDecision = userInput.nextInt();
if (battleDecision == 1){
updWizHP = Player.attack(_enemy); //**** Question #2 Below
if (updWizHP <= 0){
charWinning = true;
break;
}
}else if(battleDecision == 2){
System.out.print("Enter your guess: ");
int playerGuess = userInput.nextInt();
if (playerGuess == spellCast){
System.out.printf("The %s's spell is cast successfully! The Wizard's HP is now 0!\n\n", getName());
charWinning = true;
updWizHP = 0;
break;
}else{
System.out.print("Your spell missed the Wizard. Now he attacks!\n");
}
}
if (getHitPoints() > 0){
enemyDamage = Enemy.attack();
decreaseHitPoints(_enemy.attack(Player)); \\**** Question #3 below
if (getHitPoints() < 0){
charWinning = false;
break;
}
}
}while(getHitPoints() > 0 && _enemy.getHitPoints() > 0);
if (charWinning)
return true;
else
return false;
}
}
请记住,这是子类( Player
)中的一种方法,它与( Enemy
)具有大致相同的方法, Enemy
这一个和其他几个方法相同。
根据上面的代码,这是我的具体问题:
方法battleWizard
第6 battleWizard
(注释中的#1问题)-由于此方法位于Player
类中,因此我可以以此方式引用Enemy
类吗? 如果没有,有什么更好的方法?
方法battleWizard
第12 battleWizard
(注释中的#2问题)-当方法(代码示例)在类本身中时,如何引用以其自己的名称创建对象的类? 我想接受最终用户的播放player
播放player
并在自身内部引用该对象,如果这有意义吗? 我试图形象化地说明编译器将如何执行此任务,并且无法想象这种工作方式。
从底部开始的13行(注释中的#3问题参考):a)您可以将一个方法作为参数传递给Java中这样的另一个方法吗? b)像这样调用另一个子类(与调用该类的子类相同的子类)的正确方法是可能的吗?
感谢您的帮助。 如前所述,由于这是一个类分配,所以我不想提供更多代码示例。 但不可避免的是,如果这有助于我理解,我会。 请让我知道您需要什么进一步的信息。
预计到达时间:我添加了其他代码来描述父类和子类之间的关系。 对于Enemy
子类,攻击方法依赖于Character
超类。 因此,在上面的代码示例中,我希望它能阐明3.b。 我的问题。 需要任何其他信息,请让我知道。
由于定义了attack(Player _player)
,这意味着您只允许传递Player
对象,但您正在使用像Player.attack(_enemy)
这样的方法,它意味着传递Enemy
对象,因此会出现编译错误。
您需要更正此问题。 阅读我的段落“放在一边……”。
方法warWizard中的第6行(注释中的#1问题)-由于此方法位于Player类中,因此我可以以此方式引用Enemy类吗? 如果没有,有什么更好的方法?
根据您的代码示例, int updWizHP = _enemy.getHitPoints();
如果您想获得敌人的生命值,这是一个有效而明智的电话。 _enemy
是您的Enemy对象,您可以在该对象上使用任何方法,只要该方法存在于该类中即可。
方法warWizard中的第12行(注释中的#2问题)-当方法(代码示例)在类本身中时,如何引用以其自己的名称创建对象的类? 我想接受最终用户的播放器播放器,并在自身内部引用该对象,如果这有意义吗? 我试图形象化地说明编译器将如何执行此任务,并且无法想象这种工作方式。
由于Player
扩展了Character
,因此您将在Player
类中继承attack
方法(可视化为在Character
类中定义attack
方法)。 因此,您实际上不需要使用updWizHP = Player.attack(_enemy);
但是您只需使用updWizHP = attack(_enemy);
。 但是,这是编译错误,请阅读答案的第一部分和最后一部分。
现在,由于attack
方法不使用任何的实例字段Player
类(的状态Player
类),所以你不必担心,但如果是,那么你有没有想过,并决定在其Player
,你想打电话给你的类对象attack
方法。
从底部开始的13行(注释中的#3问题参考):a)您可以将一个方法作为参数传递给Java中这样的另一个方法吗? b)像这样调用另一个子类(与调用该类的子类相同的子类)的正确方法是可能的吗?
decreaseHitPoints(_enemy.attack(Player));
你是不是传递方法的另一种方法,但首先_enemy.attack(Player)
将会被评估并为你的代码的int
将返回和值将被传递到decreaseHitPoints
。 _enemy.attack(Player)
会给您编译错误,因为您没有将Player
定义为对象引用变量。 您必须使用一些变量,不能使用这样的类名。 最好使用_enemy.attack(this)
_enemy.attack(Player)
这表明,在攻击方法中,您想传递一个Player
对象,现在您可以使用_enemy.attack(this)
,这意味着传递当前调用了battleWizard
对象(有意义)或使用_enemy.attack(new Player())
意味着创建一个Player
类的新对象并传递该对象。
public int attack(Player _player){
作为public int attack(Character _character){
因为这样在将来你可以使用attack
方法传递一个Enemy
对象或某些子类的Character
那就是“继承”和“程序到接口”的美 。 我建议您搜索并了解这两个概念。
giveMeAnyCharacter(Character char)
可以用作giveMeAnyCharacter(new Person())
或giveMeAnyCharacter(new Enemy())
。 this
表示当前对象或实例,而super
表示超类。 因此,可以创建一个新对象,或者如果您想使用与您正在使用的对象相同的对象,请使用this
。 因此,Java对方法和字段(以及类)具有“可见性”,它定义了其他类确切可见的内容。 查找fe JLS 6.5.7.1-1,简单方法名称和可见性。
但是,在您的情况下,“不能应用于给定类型”意味着您将与签名所说的参数类型不同的参数传递给方法。
不过,对于问题2,你只写this.attack(_enemy)
或者干脆attack(_enemy)
(顺便说一句,下划线是什么?我希望这是转换产生的产物,而不是您的样式指南中的内容)
问题3:只需使用_enemy.attack(this)
。
顺便说一句,您混合使用了OO术语-一个遍历类的实例。
您的问题尚不清楚,但是我认为问题在于您缺乏术语以及缺乏理解。 我会为您尝试一些建议:
方法warWizard中的第6行-由于此方法位于Player类中,因此我可以以此方式引用Enemy类吗? 如果没有,有什么更好的方法?
int updWizHP = _enemy.getHitPoints(); //****** Question 1. below
如果getHitPoints()
在Player
类中,则不能使用Enemy
实例调用它。 字段和方法必须存在于调用中使用的实例的类或其继承树中(超类)。
如果getHitPoints()
对于Player
和Enemy
都是通用的,则应将方法放在两个通用的最近的类中-在您的情况下,它将是Character
类。 将方法放在Character类中(并赋予其保护性或公共可见性),使其可以同时存在于Player
类和Enemy
类中(并使用Player和Enemy的关联实例进行调用)
当方法(代码示例)在类本身中时,如何引用以自己的名称创建对象的类?
我可能无法想象您在这里描述的是this关键字(您的代码中似乎没有使用该关键字)。 this
表示您所在的类的当前实例。
因此,使用this.attack(_enemy)
是如何使当前Player
实例攻击指定的敌人。
a)您可以将一个方法作为参数传递给Java中这样的另一个方法吗? b)像这样调用另一个子类(与调用该类的子类相同的子类)的正确方法是可能的吗?
a)否。Java不允许将方法作为参数传递。 如果要传递方法,则必须将一个实例 (包含该方法的类)作为变量传递(例如x
),然后将要执行的方法称为x.method()
。 您正在做的是调用方法并将返回值用作参数 ,这是完全允许的。
decreaseHitPoints(_enemy.attack); // passing a method - not allowed
decreaseHitPoints(_enemy.attack(Player)); // passing a return value from calling a method - OK
b)我想你想要的是this.decreaseHitPoints(_enemy.attack(this));
。 是的,你可以(也应该)在其他类调用方法-但如果你调用的类是无关的(即不是从继承),你只能调用这些方法,如果他们已经宣布与公众知名度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.