質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

5回答

2235閲覧

javaのパッケージについての質問です(超初歩の質問です)

nuiri1343

総合スコア54

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/15 13:18

###前提・実現したいこと
他パッケージのクラスを使いたい
具体的には、パッケージAにあるMainクラスにて、パッケージBにあるSubクラスを呼び出したいです。

###発生している問題・エラーメッセージ

エラー : パッケージBは存在しません

###該当のソースコード
src\A\Main.java

java

1package A; 2 3 4public class Main{ 5 6 public static void main(String[] args){ 7 8 B.Sub sub = new B.Sub(); 9 sub.display(); 10 } 11}

src\B\Main.java

java

1package B; 2 3public class Sub{ 4 5 public void display(){ 6 System.out.println("こんにちわ"); 7 } 8}

###コンパイルの仕方
カレントディレクトリが、srcの一つ上の状態で、もう一つのディレクトリclassにコンパイルしました。

つまり、今見えてるディレクトリがsrcディレクトリと、classディレクトリの状態で、
srcディレクトリ内にはAディレクトリとBディレクトリが、
classディレクトリ内には何も入っていない状態で、

javac -d class src\A\Main.java

というのを、コマンドプロンプトで打ち込んだところ、
エラー : パッケージBは存在しません
となりました。

javac -d class src\B\Sub.java

とやったところ、問題なくコンパイルできました。
その後もう一度

javac -d class src\A\Main.java

とやりましたが、変わらずエラーが出ているところです。
###他にも試したこと
それぞれのパッケージ宣言をC.A C.Bにして、ディレクトリも、src\C\A\Main.java src\C\B\Sub.javaと配置して
javac -d class src\C\A\Main.javaを実行しても同じエラーが出てしまいました。
###聞きたいこと

どうやったら、パッケージAにあるメインクラスからパッケージBにあるサブクラスを呼べるのか
→階層構造やパッケージ宣言の仕方を変えればいいのか、それとも呼び出し方を変えればいいのか?それともコンパイルの仕方に問題があるのか・・・?

すごく初歩な質問なのですが教えていただけると助かります。
ネットで少し調べたのですが、"完全に書かなければいけない"とサラッと書いてあるところばかりで
自分の読解力では結局何がいけないのかわかりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

以下のようにやればコンパイルできます。複数パターンあげておいたので何故コンパイルできなかったのかはご自分で考えてみてください。

1ファイルづつコンパイル(例1)

sh

1$ javac -d classes -sourcepath src src/A/Main.java 2$ javac -d classes -sourcepath src src/B/Sub.java

1ファイルづつコンパイル(例2)

sh

1$ cd src 2$ javac -d ../classes A/Main.java 3$ javac -d ../classes B/Sub.java

まとめてコンパイル

sh

1$ javac -d classes src/**/*.java

実行

sh

1$ java -cp classes A.Main

投稿2016/12/15 21:41

tkmtmkt

総合スコア1800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2016/12/19 15:19

とても参考になりました! 特にまとめてコンパイルの方法、そのやり方を始めてみたので驚きました 一応、自分であれこれ試してみて javac -d class src\A\Main.java src\B\Sub.java でできたのですが これでは根本的な解決になってないなーと思っていました。 おかげですっきりしました。 ソースパスの話だったということですね ありがとうございました
guest

0

>cd src >javac -d ..\class A\Main.java

このようにsrcディレクトリに移動してからA\Main.javaをコンパイルしてください。BパッケージのSub.javaも自動的にコンパイルしてくれます。移動しているのでクラスファイルの出力先は..\classとしてください。

投稿2016/12/15 16:12

guest1213

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2016/12/19 15:17

できましたー どうもありがとうございます
guest

0

パッケージAにあるMainクラスにて、パッケージBにあるSubクラスを呼び出したい

Mainクラスで
インポート文でパッケージBにあるSubクラスを指定する事ができます

import xxx.yyy.B.Sub;//このようにディレクトリがどうなってるか知りませんが

ちゃんとディレクトリを確認したうえで
していしてください。
javaでは大文字小文字も気を付けて指定してください。
たぶん簡単なスペルミス等と思いますよ。

投稿2016/12/17 10:15

dec5798

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/17 11:05

>「たぶん簡単なスペルミス等と思いますよ。」 ちゃんと、投稿者のコードで実行出来ているのになぜ、「たぶん簡単なスペルミス等と思いますよ。」になるのでしょうか? nuiri1343さんのコードに一切の間違いはないですよ。 class間で、、、import 云々となりやすですが、 今回の例は、javacをどのディレクトリ、フォルダで実行するかが、問題の解決への回答になります。 import 云々での解決方法も有りますが、(超初歩の質問です)とのことですので、 javacを実行する、ディレクトリ、フォルダに、議論を集中した方が良いと思います。
nuiri1343

2016/12/19 15:22

importでの解決方法というのはどんなものなのでしょうか? あくまで自分のスキルアップのためだけの質問なのですが、 答えていただけるとうれしいです。
guest

0

=====再現=====
C:\test>javac -d classes src\A\Main.java
src\A\Main.java:8: エラー: パッケージBは存在しません
B.Sub sub = new B.Sub();
^
src\A\Main.java:8: エラー: パッケージBは存在しません
B.Sub sub = new B.Sub();
^
エラー2個

C:\test>
============

javacの実行場所が違います。
srcの中でないと、class依存が解決出来なくて、上記異常になります。

srcの中に入って、コンパイルすれば、下記の様に

C:\test\src>javac -d ../classes A/Main.java
で、classesの中にフォルダA,Bが出来、その中にそれぞれの.classが出来て、

C:\test>java -cp classes A.Main

「こんにちわ」
と表示します。

<Main.java>
package A;

public class Main {

public static void main(String[] args) { B.Sub sub = new B.Sub(); sub.display(); }

}

<Sub.java>
package B;

public class Sub {

public void display(){ System.out.println("こんにちわ"); }

}

=====cmd、ここから=====
C:>cd test

C:\test>dir
2016/12/16 08:01 <DIR> classes
2016/12/16 07:59 <DIR> src

C:\test>cd src

C:\test\src>dir
2016/12/16 07:59 <DIR> A
2016/12/16 07:59 <DIR> B

C:\test\src>cd A

C:\test\src\A>dir
C:\test\src\A のディレクトリ
2016/12/16 07:38 139 Main.java

C:\test\src\A>cd ..

C:\test\src>cd B

C:\test\src\B>dir
C:\test\src\B のディレクトリ
2016/12/16 07:56 117 Sub.java

C:\test\src\B>cd ..

C:\test\src>dir
C:\test\src のディレクトリ
2016/12/16 07:59 <DIR> A
2016/12/16 07:59 <DIR> B

C:\test\src>javac -d ../classes A/Main.java

C:\test\src>cd ..

C:\test>cd classes

C:\test\classes>dir
C:\test\classes のディレクトリ
2016/12/16 08:24 <DIR> A
2016/12/16 08:24 <DIR> B

C:\test\classes>cd A

C:\test\classes\A>dir
C:\test\classes\A のディレクトリ
2016/12/16 08:24 311 Main.class

C:\test\classes\A>cd ..

C:\test\classes>cd B

C:\test\classes\B>dir
C:\test\classes\B のディレクトリ
2016/12/16 08:24 395 Sub.class

C:\test\classes\B>cd ..

C:\test\classes>cd ..

C:\test>java -cp classes A.Main
こんにちわ

C:\test>javac -version
javac 1.7.0_80

C:\test>

=====cmd、ここまで=====

投稿2016/12/15 23:45

編集2016/12/15 23:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2016/12/19 15:21

>srcの中でないと、class依存が解決出来なくて この意味を少し詳しく教えていただけないでしょうか・・・? おかげで問題は解消できましたが、疑問はいまいち解決していない感じです。 他の回答者様の言ってた、ソースパスの違いということで間違いないのでしょうか?
guest

0

src\A\Main.javaの
package A;
の下に

import B.*;
を入れるのではないでしょうか

投稿2016/12/15 13:28

編集2016/12/15 15:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2016/12/15 15:42

それも一応やりましたが、その場合、 import B; の行でパッケージBは存在しませんというエラーが出るのです。 そもそも、import B;でできて、B.Subでできないというのはありえないと思うので、 もっと根本的な問題なのではないかなーというふうに想います。
退会済みユーザー

退会済みユーザー

2016/12/15 15:57

カレントディレクトリがsrcの上だと package src.A; や package src.B; とするのではないでしょうか この場合 package src.A; の下に import src.B; が必要だと思います
nuiri1343

2016/12/19 15:17

そういう問題ではなかったようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問