以下意外编译并运行没有问题:
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。
最佳答案
假设您有两种方法,一种返回 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;
关于class - 什么时候需要在java中导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904067/