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

2 つのメソッドがあり、1 つは戻り、foo.Locationもう1 つは戻りますbar.Location(まったく異なる 2 つのクラスがたまたま同じ名前を持っていますが、パッケージは異なります - 完全に有効です)。

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;

...または 1 つの場所だけをインポートします。

import foo.Location;

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

そのクラスをインポートする必要がない理由は、そのクラスを明示的に使用していないためです。クラスを実際にローカルで使用しているActorものです。Location クラスへの参照を保持していないため、動的に使用し続けることができます。ただし、参照 (たとえば ) を保持したい場合は、コンパイラがLocation とリンクする必要があるため、インポートする必要がありますが、どこにあるのかわかりません。LocationLocation l = getLocation();Locationl

于 2012-12-16T18:12:21.643 に答える