Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
操作方法时出现问题-Java_Java_Inheritance_Methods - Fatal编程技术网

操作方法时出现问题-Java

操作方法时出现问题-Java,java,inheritance,methods,Java,Inheritance,Methods,我试图操作一个抽象类中的公共方法。 我试图从一个公共方法内部操作该方法,该方法位于扩展另一个抽象类的公共类内部,但编译器给了我: "non-static method method_name() cannot be referenced from a static context" 我需要什么才能使它运行该方法 public class Dingo extends Animal { public void act() { if (kangarooCrossing()

我试图操作一个抽象类中的公共方法。 我试图从一个公共方法内部操作该方法,该方法位于扩展另一个抽象类的公共类内部,但编译器给了我:

"non-static method method_name() cannot be referenced from a static context"
我需要什么才能使它运行该方法

public class Dingo extends Animal
{
    public void act()
    {
      if (kangarooCrossing())
      {
            Weapon.killAnimalMySquare();    //<<<<<<<<<< THE Problematic line
      }

      if(canMove()) 
            move();
      else 
            changeDirection();
    }
    // returns true if a Kangaroo is crossing.
    private boolean kangarooCrossing()
    {
        Actor kangaroo = getOneObjectAtOffset(0, 0, Kangaroo.class);
        if(kangaroo != null) {
            return true;
        }
        else {
            return false;
        }
    }
}

abstract class Weapon  extends Actor
{
    /**Kills an animal that steps on current square*/
     public void killAnimalMySquare()
    {
        Actor animal = getOneObjectAtOffset(0, 0, Animal.class);
        if(animal != null)
            getWorld().removeObject(animal);
    }
    /**returns true if an animal is crossing*/
    public boolean animalCrossing()
    {
         Actor animal = getOneObjectAtOffset(0, 0, Animal.class);
         if(animal != null) 
             return true;
         return false;
    }
}
公共级野狗扩展动物
{
公共无效法
{
if(kangarooCrossing())
{

killAnimalMySquare();//调用目标方法的方法似乎是静态的


您需要创建此类的实例并对实例调用此方法。

要使用
this
super
引用调用方法,您在子类中创建的公共方法不应是静态方法

根据您提交的代码进行编辑: 不能像这样从类
武器
调用方法
killAnimalMySquare

Weapon.killAnimalMySquare();
killAnimalMySquare();
你应该这样称呼它:

Weapon.killAnimalMySquare();
killAnimalMySquare();


如果killAnimalMySquare()是正确的语法,则声明为静态。

我们需要更多的代码来给出更具体的答案,但一般的答案是,您试图从静态方法中调用非静态方法。您需要创建对象的实例,然后使用该对象调用非静态方法

比如:

MyAbstractClass abstract = new MyDerivedClass();
abstract.my_overridden_method();

您需要对子类的实例调用该方法。您能给我提供一个示例吗?
newsubclasstype().method\u name()
而不是
SubclassType.method\u name())
@Master C-您能给我们看一下您的代码吗?@MasterC,请不要使用标志按钮回答您的问题,而是使用每个答案下面的评论系统。谢谢。请参阅上面我的编辑部分。因此我应该将killAnimalMySquare()声明为静态?因为有了您的3个给定选项,编译器会说:“找不到符号-方法killAnimalMySquare()”..方法killAnimalMySquare()是在抽象类武器中定义的,不知何故我之前认为子类Dingo是在扩展武器,但这显然不是编译器抱怨的原因。使killAnimalMySquare为静态也不起作用,因为该方法调用武器或演员类的其他方法。此外,武器是抽象类,所以您可以我甚至不创建那个类的实例。顺便说一句,我相信武器没有必要是抽象的,因为那个类中没有抽象方法(除非参与者有一些抽象方法,而这些抽象方法并没有在武器中实现)。我不希望客户从“武器”创建对象。那么,我应该怎么做才能解决这个问题?有一些方法可以限制客户创建类武器实例,比如将其构造函数设置为私有或将其设置为Dingo的内部私有类。有关更多信息,请参阅本文:或此讨论: