以下意外编译并运行没有问题:
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.
答案 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.Location
和bar.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链接,但不知道在哪里找到它