web-dev-qa-db-ja.com

java

メインディレクトリ(main.Javaを含む)とサブディレクトリ(child.Javaを含む)があります。

私の問題は、main.Javaでchild.Javaをインスタンス化する方法です

  1. 子クラスを公開しました。 &line#1をpackage mypackageとして追加しました
  2. 新しいmypackageディレクトリを作成するchild.classを使用してjavac -d . child.Javaをコンパイルしました。
  3. 私は次のようにメインで子クラスをインポートしようとしました:import subdirectory.mypackage.*(-dオプションはmypackageフォルダー内にchild.classを配置することに注意してください)
  4. 「javac main.Java」でmain.Javaファイルをコンパイルしました

次のエラーが発生します。

mainAESE.Java:9: cannot access subdirectory.child
bad class file: RegularFileObject[./subdirectory/child
class file contains wrong class: mypackage.child
Please remove or make sure it appears in the correct subdirectory of the class
child childInstance= new child();
^
1 error

私を助けてください!!

7
Rookie

パッケージフォルダーmypackageおよびMain.class親フォルダを共有します。

package mypackage;
public class Child {}

Mainクラスはdefaultパッケージに作成されていると思います。

public class Main {
   public static void main(String []args){
         mypackage.Child child=new mypackage.Child();
   }
}

そしてあなたのディレクトリ構造は次のようになります:

main-directory/
              |
              |----/mypackage/
                            Child.class
              |
              | Main.class
              | Main.Java
              | Child.Java

Mainを次のコマンドで起動/ロードするには、

Javaメイン

4
adatapost

2つのことを行う必要があります。

  1. 現在のインポートをimport mypackage.childに置き換えます

    インポートは、インポートするクラスの 完全修飾名 を反映する必要があります。マシン上のクラスファイルの場所とは関係ありません。また、import mypackage.*を実行して、必要なクラスを個別に指定する代わりに、パッケージmypackageからすべてのクラスをインポートすることもできます...これはコーディングスタイルの選択にすぎません。

  2. クラスパスにsubdirectoryを追加します

    一方、クラスパスは、doesがマシン上のクラスファイルの場所に関係しています。その名前が示すように、JVMがプログラムが使用するクラスを探す必要があるすべての場所へのパスがリストされています。または、オラクルが言うように、 「クラスパスはJDKツールおよびアプリケーションにサードパーティおよびユーザー定義のクラスの場所を指示します。」 指示する必要はありませんJava付属の特殊クラスの場所(Stringなど)。

    #2の手順は、プログラムの実行方法(コマンドラインまたはEclipseなどから)によって異なります。 (コメントごとに)コマンドラインを使用しているため、-classpathフラグまたはその短縮形である-cpを使用する必要があります:Java -cp ./subdirectory main

3
Pops

次のファイルがあります。

main.Java mypackage/child.Java

main.Javaでは、最初の行は次のようになります。

import mypackage.child;

main.Javaがあるディレクトリから、実行します

javac mypackage/child.Java

その後:

javac main.Java

mypackageには、child.Javaとchild.classが含まれている必要があります

Javaメインは、mypackageというサブディレクトリで子を探すため、動作するはずです。

2
Diego Basch