4

以下意外编译并运行没有问题:

import info.gridworld.actor.Actor;
import java.util.ArrayList;

public class ChameleonKid extends ChameleonCritter
{
    public ArrayList<Actor> getActors()
    {
        ArrayList<Actor> actors = getGrid().getNeighbors(getLocation());
          ArrayList<Actor> frontBack = new ArrayList<Actor>();
          for(Actor i : actors)
              if(getLocation().getDirectionToward(i.getLocation())==getDirection())
                    frontBack.add(i);
        return frontBack;
    }
}

Actor 类中的方法 getLocation() 返回 Location 的一个实例。然后我调用 Location 类的 getDirectionToward() 方法。getLocation().getDirectionToward(i.getLocation()). 这是如何运作的?我从未导入 Location 类。我如何使用它并调用它的方法?如果它是这样工作的,我什么时候需要导入一个类?只有当我实例化它时?

我正在使用 Java 7。

4

2 回答 2

3

假设您有两种方法,一种返回foo.Location,另一种返回bar.Location(两个完全不同的类碰巧具有相同的名称,但在不同的包中 - 完全有效):

foo.Location getFooLocation();
bar.Location getBarLocation();

当您可以在同一个类中使用这两种方法并链接一些方法时,您不需要导入:

if(getFooLocation().onlyInFoo()) {
  //...
}
if(getBarLocation().onlyInBar()) {
  //...
}

它之所以有效,是因为编译器完全确定您使用的是哪个版本(来自哪个包),并且Location它知道在哪里可用。onlyInFoo()onlyInBar

但是假设您需要一个局部变量:

Location location;
// much later
location = getFooLocation();

现在编译器并不真正知道Location你的意思,所以你必须通过使用包处理类名来帮助他:

foo.Location location;

或通过导入该类:

import foo.Location;

你现在应该问:如果我想同时拥有foo.Locationbar.Location的局部变量怎么办?好吧,你不能同时导入它们,显然:

//WRONG
import foo.Location;
import bar.Location;

您可以再次做的是:要么根本不导入并使用完全限定名称:

foo.Location location1;
bar.Location location;

...或仅导入一个位置:

import foo.Location;

//...
Location location1;     //foo.Location
bar.Location location2;
于 2012-12-16T18:13:14.860 回答
2

您不需要导入该类的原因是您没有明确使用该类。Actor实际Location在本地使用该类的那个。您永远不会持有对 Location 类的引用,因此您可以继续动态使用它。但是,如果您想保存一个引用(例如Location l = getLocation();),则必须导入Location,因为编译器必须l与 Location 链接,但不知道在哪里可以找到它。

于 2012-12-16T18:12:21.643 回答