Java:在自己的方法

时间:2015-11-14 22:23:51

标签: java inheritance methods subclass superclass

我正在进行一项我正在尝试调试的作业。我有很多error: (method name) in class (SuperClass Name) cannot be applied to given types;。该项目将一个以程序编程为中心的游戏重新用于同一游戏,但现在围绕OOP。我是Java的新手,他的任务是创建大量的类,其中两个是超类的子类(显然),我已经获得了具有哪些方法及其参数。我遇到的问题是,子类中的一个方法应该控制两个角色,即玩家和敌人之间的战斗。这两个类都是字符类(超类)的子类。由于这是一个课程作业,我不想发布我拥有的所有内容,但下面是我正在尝试执行的战斗方法的示例。我遇到的问题,一般来说,继续使用“继承”,正好父/子类之间继承的内容以及如何传递某些值/变量他们每个人之间。

在下面的示例代码中,此方法嵌套在扩展Player类的Character类中。此方法需要使用来自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)的方法大致相同,不包括这个和其他一些方法。

就我上面的代码而言,以下是我的具体问题:

  1. 方法battleWizard中的第6行(注释中的#1问题) - 由于此方法位于Player类中,我可以通过这种方式引用Enemy类吗?如果没有,有什么更好的方法呢?

  2. 方法battleWizard中的第12行(注释中的#2问题) - 当方法(代码示例)在类本身中时,如何引用具有以其自己的名称创建的对象的类?我想带终端用户的播放器player并在其内部引用该对象,如果这有意义的话?我试图想象编译器将如何执行此任务,并且无法想象这有效。

  3. 从底部开始的13行(注释中的#3问题参考): a)你可以将一个方法作为参数传递给Java中的另一个方法吗? b)是调用另一个子类(与调用类的子类级别相同的子类级别)的正确方法,或者它是否可能?

  4. 感谢您的帮助。正如我之前提到的,因为这是一个类赋值,所以我不想提供更多代码示例。但不可避免的是,如果它能帮助我理解那么我会。请告诉我您需要的更多信息。

    ETA: 我添加了额外的代码来描绘超级和子类之间的关系。对于Enemy子类,它依赖于攻击方法的Character超类。所以在我上面的代码示例中,我希望它澄清3.b.我的问题如需更多信息,请告知我们。

3 个答案:

答案 0 :(得分:2)

您收到编译错误,因为您定义了attack(Player _player),这意味着您只允许传递Player个对象,但您使用的是Player.attack(_enemy),这意味着传递Enemy个对象

您需要更正此问题。阅读我的段落,&#34;作为旁边...&#34;。

  

方法战斗中的第6行向导(注释中的#1问题) - 自此   方法驻留在Player类中,我可以引用Enemy类   这条路?如果没有,有什么更好的方法呢?

根据您的代码示例,int updWizHP = _enemy.getHitPoints();是一个有效且明智的通话,如果您想获得敌人的生命值。 _enemy是你的敌人对象,只要该方法存在于该类中,你就可以使用任何方法。

  

方法战斗中的第12行向导(注释中的#2问题) - 我该怎么做   引用一个类,该类具有在其中创建的对象的自己的名称   方法(代码示例)是在类本身?我想接受   最终用户的玩家玩家并在其内部引用该对象,如果   那讲得通?我试图想象编译器将如何   执行此任务,无法想象这有效。

由于Player正在扩展Character,因此您可以在attack类中继承Player方法(将其视为attack方法中的定义Character方法1}}类)。因此,您真的不需要使用updWizHP = Player.attack(_enemy);,但您只需使用updWizHP = attack(_enemy);。但是,这是一个编译错误,请阅读我的第一部分和最后一部分答案。

现在,由于attack方法未使用Player类的任何实例字段(Player类的状态),因此您无需担心,但如果是你必须思考并决定}哪个Player类对象要用你的attack方法。

  

从底部开始的13行(注释中的#3问题参考):a)你可以   将一个方法作为参数传递给Java中的另一个方法? b)   是调用另一个子类的正确方法(与子类相同   那个叫这个班的人这样或者甚至可能吗?

  • 对于#3.a:使用decreaseHitPoints(_enemy.attack(Player));您没有将方法传递给其他方法但首先评估_enemy.attack(Player),并将int作为您的代码将被返回,该值将传递给decreaseHitPoints
  • 对于#3.b:您没有调用任何子类,但是您正在调用对象上的方法,如果该对象所代表的类位于继承中并不重要树与否。只需要确保它是一个逻辑调用,并且该方法存在于类中。 我猜_enemy.attack(Player)会给你编译错误,因为你没有将Player定义为对象引用变量。你必须使用一些变量,不能像这样使用类名。更好地使用_enemy.attack(this)


 _enemy.attack(Player)这表示在攻击方法中你要传递一个Player对象,现在要么使用_enemy.attack(this),这意味着要传递调用battleWizard的当前对象(make感觉)或使用_enemy.attack(new Player())这意味着创建一个Player类的新对象并传递它。

<小时/> 另外,我认为您最好将public int attack(Player _player){定义为public int attack(Character _character){,因为将来您可以使用attack方法传递Enemy对象或Character

的一些子类

&#34;继承&#34; &#34;程序界面&#34; 的美妙之处。我建议你搜索并了解这两个概念。

<小时/> 很少有快速笔记,您可能会注意到(这些是试图揭示主题/概念的一般说明,可能会有更多的限制行为,所以请详细阅读每个主题/概念):

  • 对象是类的运行时表示。
  • 超类的方法由子类继承,如果从同一个类调用,则调用它们不需要使用对象。将此可视化为在同一个类中定义该方法(在上下文公共v / s受保护的v / s私有方法中继续阅读继承)。
  • 您可以覆盖继承的方法。
  • 可以使用任何子类的对象调用接受超类型的方法。例如,在您的情况下,giveMeAnyCharacter(Character char)可以用作giveMeAnyCharacter(new Person())giveMeAnyCharacter(new Enemy())
  • 在Java中this表示当前对象或实例,super表示超类。因此,要么创建一个新对象,要么想要使用您正在呈现的相同对象,请使用this
  • 始终将所有常用代码(方法或实例字段)放在超类中,让子类利用继承来利用它。

答案 1 :(得分:1)

因此,Java具有&#34;可见性&#34;对于方法和字段(以及类),它定义了对其他类可见的确切内容。查找f.e. JLS 6.5.7.1-1,简单方法名称和可见性。

但是,在你的情况下&#34;不能应用于给定的类型&#34;意味着您传递的方法不同于签名所说的参数类型。

不过,对于问题2,您只需撰写this.attack(_enemy),或只是attack(_enemy)。 (顺便说一句,下划线是什么?我希望它是转换中的神器而不是你的风格指南中的东西)

问题3:只需使用_enemy.attack(this)

顺便说一下,你把你的OO术语混淆了 - 一个传递了类的实例。

答案 2 :(得分:1)

您的问题尚不清楚,但我认为问题在于您缺乏术语以及缺乏理解。我会为你试一试:

  

方法battleWizard中的第6行 - 由于此方法驻留在   玩家类,我可以用这种方式引用敌人类吗?如果不,   这样做的更好方法是什么?

int updWizHP = _enemy.getHitPoints(); //****** Question 1. below    

如果getHitPoints()类中有Player,则无法使用Enemy 实例调用它。字段和方法必须存在于调用中使用的实例的类中,或者存在于其继承树(超类)中。

如果getHitPoints()Player共有Enemy,那么您应该将方法放在最接近的类中 - 在您的情况下,它应该是{{1} } .class。将该方法放在Character类中(并赋予它受保护的公共可见性)允许它存在于CharacterPlayer类中(和使用Player和Enemy的相关实例调用)

  

如何引用具有自己创建的对象的类   方法(代码示例)在类本身中的名称?

我可以想象你在这里描述的唯一一件事是这个关键字(你似乎没有在你的代码中使用它)。 Enemy表示您所在班级的当前实例。

因此,使用this是如何让当前的this.attack(_enemy)实例攻击指定的敌人。

  

a)你可以将一个方法作为参数传递给另一个像这样的方法   Java的? b)是调用另一个子类(同一个子类)的正确方法   像这样调用类的级别)或者甚至可能吗?

a)否.Java不允许将方法作为参数传递。如果要传递方法,则必须将实例(包含该方法的类)作为变量传递 - 比如Player - 然后调用要执行的方法{ {1}}。您正在做的是调用方法并使用返回值作为参数,这是完全允许的。

x

b)我认为你想要的是x.method()。是的,您可以(并且应该)调用其他类中的方法 - 但如果您的调用类是不相关的(即不是从中继承),则只有在使用 public 可见性声明它们时才能调用这些方法。