今java gold SE7 の資格勉強をしています。
問題を解いていて解説を見ても調べてもわからないところがあったのでアドバイスいただきたいです。
スピードマスター 1-21の問題です。
java gold SE7 スピードマスタ問題集[1-21]
この解説でC以外の選択肢がなぜダメなのかの理由が知りたいです。
とくにDはなぜダメなのか。
参照するクラスの上の階層のフォルダを指定しているので、Cと同じ理屈ではないのか。
と思ってしまいます。
パッケージだから実際のパスでは上の階層ではない?などいろいろ考えたり、調べてみたのですが、
重箱の隅を突くようなところなのでピンとする答えが掴めていません。
お助け願います。
もしわかる方がいらっしゃればよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
[2017.03.24 11:00 追記] ===========
回答に対する指摘があります。ご参照ください。
[] ============================
クラスパスとパッケージの違い?境界?については、自分も納得が行くまで色々と試してみました。
経験則からですが、クラスパスとパッケージの違いは
・クラスパス:classファイルが置かれているディレクトリ
・パッケージ:クラスパスで指定したディレクトリからの相対位置
と理解しています。これは、クラスファイルの置き場は
(クラスパス)/*.class
(クラスパス)/(パッケージ)/*.class
のどちらかに該当するということです。(jarについては設問に関係ないので割愛。)
おそらく、ご自身で色々試されるのが一番かと思いますが、C と D の違いについては
C.[../gold]
Access.java のパッケージ指定がpackage pack1/pack2;
となっているため
-cpオプションで指定されたgoldディレクトリからの相対位置で、gold/pack1/pack2
に
classファイルを探しに行きます。
Access.classファイルが gold/pack1/pack2
にあるので、クラスが見つかって
コンパイルが通ります。
D.[../gold/pack1/pack2]
このとき、Access.classを探しにいくのは gold/pack1/pack2/pack1/pack2
となって
しまいます。この位置に Access.class があればコンパイルが通りますが、設問の条件から
このディレクトリはありません。したがって class ファイルが見つからずにコンパイルエラーとなります。
参考:環境はjava8ですが、同等の環境を作ってコンパイルした結果
ディレクトリ構成
[example] $ find * -type f gold/pack1/pack2/Access.class gold/pack1/pack2/Access.java test/pack3/pack4/Sample.java [example] $
答え:C
[test] $ javac -cp ../gold -d . pack3/pack4/Sample.java [test] $
答え:D
[test] $ javac -cp ../gold/pack1/pack2 -d . pack3/pack4/Sample.java pack3/pack4/Sample.java:3: エラー: パッケージpack1.pack2は存在しません import pack1.pack2.Access; ^ pack3/pack4/Sample.java:7: エラー: シンボルを見つけられません Access a = new Access(); ^ シンボル: クラス Access 場所: クラス Sample pack3/pack4/Sample.java:7: エラー: シンボルを見つけられません Access a = new Access(); ^ シンボル: クラス Access 場所: クラス Sample エラー3個 [test] $
投稿2017/03/24 00:40
編集2017/03/24 02:07総合スコア27
0
クラスパスは「参照の基準点となる位置」を指定しなければなりません。
Accessクラスはexample/gold/pack1/pack2の下に入っています。そして、Accessのパッケージ宣言はpack1.pack2となっています。SampleにもAccessのインポート文はimport pack1.pack2.Accessと書かれていますよね?相対パスがpack1/pack2/Access.javaにするためには、基準となるクラスパスはgoldのフォルダを指していなければなりません。
もしあなたの言うように選択肢Dをクラスパスとした場合、Accessのパッケージ宣言は「無し(デフォルトパッケージ)」でなければならず、前提となるパッケージ宣言とSampleでのimport文に相違が生まれます。なのでCでなければならないのです。
投稿2017/03/24 00:40
総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
備忘録
■基本的なコンパイル方法
C:\example\gold\pack1\pack2> javac Access.java
■必要なクラスファイルがカレントディレクトリ以外にある場合
C:\example\test>javac -cp ..\gold -d . pack3\pack4\Sample.java
(..\goldを参照してpack3\pack4\Sample.javaをコンパイルして、クラスファイルをカレントディレクトリ(.)に出力する)
参考URL 「C:\hoge.jarを参照して、C:\pkg\Sample.javaをコンパイルして、クラスファイルを...」部分
デフォルトでは、コンパイラは、各クラスファイルを対応するソースファイルと同じディレクトリに置きます。別の出力先ディレクトリを指定するには、-d を使用します 参考URL
投稿2017/04/20 14:56
総合スコア599
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/24 00:59
2017/03/24 02:08
2017/03/24 02:30
2017/03/24 04:15
2017/03/24 22:48