2016-11-15 8 views
0

私はJavaを使い慣れていないので、コードがあまりにも愚かに見える場合は、私にご負担ください。 :-)別のクラスから別のクラスにアクセスする(両方とも同じパッケージ内にある)

私は何を達成しようとしていることは簡単です:これもクラスがあるディレクトリの名前です(同じパッケージfind_classの両方の一部である2つのクラスClassAClassBを、定義

を。

だから、次のように私のファイルである。

ClassA.java

package find_class; 

public class ClassA { 
    public void func() { 

    } 
} 

ClassB.java

package find_class; 

import find_class.ClassA; 

public class ClassB { 
    public static void main(String[] args) { 
     ClassA a = new ClassA(); 
    } 
} 

私はClassBをコンパイルすると、私はエラーの数に実行します。

find_class$ javac ClassB.java 
ClassB.java:3: error: cannot find symbol 
import find_class.ClassA; 
       ^
    symbol: class ClassA 
    location: package find_class 
ClassB.java:7: error: cannot find symbol 
     ClassA a = new ClassA(); 
     ^
    symbol: class ClassA 
    location: class ClassB 
ClassB.java:7: error: cannot find symbol 
     ClassA a = new ClassA(); 
        ^
    symbol: class ClassA 
    location: class ClassB 
3 errors 

私は任意のIDEを使用していないと、次のようにディレクトリ構造は次のとおりです。

find_class 
    - ClassA.java 
    - ClassB.java 

私は間違って何をしていますか?

+0

インポートを削除します。find_class.ClassA; – bane19

+0

IDEを使用していますか?良いIDEは、あなたにこれらの問題を指摘し、それらを解決するのを手伝います。 –

+0

プロジェクトのビルドパスのパッケージ構造を確認してください。あなたのクラスはfind_classディレクトリにありますが、ビルドパスの/ project/srcになります – Zia

答えて

3

パッケージ名とクラスパスは同期する必要があります。つまり、パッケージ名はクラスパスの続きです。例えば

フォルダ構造は、X/Y/Zの場合、クラスパスは、x/yは、パッケージ名がZである、あなたはあなたに同じロジックを適用すると、YZ

をインポートするべきではありませんあなたのクラスパスはすでに "find_class"に設定されています。したがって、import文は必要ありません。

+0

したがって、デフォルトでは、クラスパスは現在のディレクトリに設定されていますか?実際には、importステートメントとpackageステートメントの両方を削除すると動作します。 – dotslash

+0

クラスパスは、明示的に設定できるものです。https://docs.oracle.com/javase/tutorial/essential/environment/paths.html – attaboy182

0

あなたのクラスはそれがパッケージ "find_class"にあると言っていますが、そのクラスはパッケージ内の他のすべてのクラスについて知っていますので、ClassAをインポートする必要はありません。

あなたが行ったように、あなたがオブジェクトを使用する必要があり、他のクラスからメソッドを使用したい場合は、他のclass.For例をインポートする必要はありません

import find_class.ClassA; 
+1

そして、 ?問題はどこか他の場所です。 – Tom

+0

@Tom正確に私のポイント!ところで、 'package'ステートメントを削除すると動作するようですが、それは不思議です。それはそれがどのようになっているのでしょうか? – dotslash

+0

@dotslashコンパイルのためのクラスパスを提供しました。 – Tom

0

行を削除します。

ClassA a = new ClassA(); 

ところで、同じパッケージ内にある場合は、インポートクラスはできません。

+2

* "同じパッケージがあれば、インポートクラスはできません。" * *は間違っていません。それは禁止されていません。 – Tom

関連する問題