什么时候需要在java中导入?

时间:2012-12-16 18:07:23

标签: class methods import java-7

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

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.

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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