Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 - Fatal编程技术网

通过Java传递不同类的对象

通过Java传递不同类的对象,java,Java,我无法将对象放入链接列表。代码如下: if(runTypes[k]==EMPTY){ Empty creature = new Empty(); } else if(runTypes[k]==FISH){ Fish creature = new Fish(); } else if (runTypes[k]==SHARK){ Shark creature = new Shark(starveTime);

我无法将对象放入链接列表。代码如下:

if(runTypes[k]==EMPTY){
      Empty creature = new Empty();
    }
else if(runTypes[k]==FISH){
            Fish creature = new Fish();
        }
else if (runTypes[k]==SHARK){
            Shark creature = new Shark(starveTime);
        }
DLinkedList.insertEnd(creature,runLengths[k]);
但是,我得到一个错误:

RunLengthEncoding.java:89: cannot find symbol
symbol  : variable creature
location: class RunLengthEncoding
        DLinkedList.insertEnd(creature,runLengths[k]);  
                              ^
1 error
Empty()是Fish和Shark的超级类

以下是循环链接列表类中insertEnd方法的代码:

public void insertEnd(Empty creature, int number) {
  DListNode3 node = new DListNode3(creature);
  head.prev.next = node;
  node.next = head;
  node.prev = head.prev;
  head.prev=node;
  node.amount = number;
  size++;
}
下面是节点的代码: 公共类DListNode3{

    public Empty creature;
    public DListNode3 prev;
    public DListNode3 next;
    public int amount;

    DListNode3(Object creature) {
        this.creature = creature;
        this.amount = 1;
        this.prev = null;
        this.next= null;
    }

    DListNode3() {
        this(null);
        this.amount = 0;
    }
    }

我不知道该怎么做,而且我是OOP新手。有什么建议吗?

当您按照如下方式声明变量时-

if(runTypes[k] == EMPTY) {
      Empty creature = new Empty();
}
该变量是在其中声明它的块(
{}
)的本地变量,并且在该块之外不可见

你想在外面用它-

DLinkedList.insertEnd(creature,runLengths[k]);
在不可见的地方。所以,编译器在抱怨

您可以执行以下操作来解决此问题-

Empty creature = null; //Empty can be the variable type, it's the parameter type in the insertEnd method
if(runTypes[k] == EMPTY) {
     creature = new Empty(); //no problem, it's the same class
} else if(runTypes[k] == FISH) {
     creature = new Fish(); //no problem, Fish is a subclass
} else if (runTypes[k] == SHARK) {
     creature = new Shark(starveTime); //no problem, Shark is a subclass of Empty
}
DLinkedList.insertEnd(creature, runLengths[k]);

我认为您正面临变量范围问题。当您尝试使用它时,生物超出了范围。您需要在if之外声明变量,然后在if内分配它。正如其他人所说,您对变量的范围有问题。一旦您了解了这一点,也一定要检查什么类型的obj要添加到列表中的ects。似乎您要添加
空对象
鲨鱼对象
、和
鱼对象。但是,
插入对象()< /Cord>方法只允许你添加<代码>空< /Cord>对象。我有两个注释/问题:<代码>空< /Cux>类代表什么?这是否应该是列表中缺少元素?如果是,则应该考虑使用<代码> null >代码>,这是用于此思想的标准java习语。说一个
Shark
是一个
空的
有意义吗?这是帮助决定一个类是否应该扩展另一个类的典型测试。这个建议的解决方案引入了一个新问题:三个同名的独立变量。我怀疑这会解决OP向创建的列表对象添加的隐含问题从不同的班级开始编辑原始版本,但不得不在中间离开:(.但是现在它被修复了。没问题。因为您确实解决了编译器错误,所以我没有否决。但是,我们现在遇到了另一个问题:类
Empty
Fish
、和
Shark
不是由OP给出的,所以我们不知道
生物=新鱼()
将编译。但OP声明Empty是Fish和Shark的一个超类,对吗?如果是这样的话,那应该没有任何问题。这就是我找到的解决方案。