

Java「デフォルトのパッケージ」の意味が分かりません。
http://takeoba.cool.ne.jp/java/packageDeclaratio …
に
パッケージ宣言しないプログラムは、デフォルトのパッケージに割り当てられます。
と書かれているのですが「デフォルトのパッケージ」の意味が分かりません。
Googleで「Java デフォルトのパッケージ」を検索してもヒットする件数は多いのですが「デフォルトのパッケージ」の意味そのものに触れたものがなかなか見つかりません。
Javaに詳しい方、よろしくお願いいたします。

No.5ベストアンサー
- 回答日時:
なんというか、パッケージを「クラスファイルの保存場所」と思われてしまうとまずいので、微妙に追加を。
まず、パッケージというのは何のためのものか、それをご理解ください。これは、クラスファイルの保存場所に関するものではありません。パッケージというのは、クラスに名前空間を与え管理するためのものです。わかりやすくいえば、ファイルをフォルダで分類して整理できるのと同じように、すべてのクラスを、場所を指定して管理できるようにするための仕組みのことです。
Javaでは、クラス名を記述してプログラムを動かしますね? では、同じクラスが複数あったらどうなるでしょうか? Javaはそれらを区別することができなくなります。が、実質問題として、さまざまな人間がすべて異なる名前でクラスを定義するとは思えません。そこで、クラスを保存する場所を階層的に指定し、「このクラスは、jp.hoge.hogeという場所にあるクラスですよ」ということを示して扱えるようにしたわけです。これが「パッケージ」です。
実際、標準で付いてくるクラスを見ると、java.awt.Buttonというように、パッケージの中に収めてあることがわかります。が、こうなると今度は「ちょっとプログラムを試しに動かしたいのに、わざわざ他とは重複しないパッケージを定義して動かさないといけないのは面倒だ」ということになります。そこで、「それじゃあ、何もパッケージを指定しないで作ったクラスは、仮にデフォルトパッケージというパッケージを用意して、その中にあるという扱いにしよう」ということで考えられたのがデフォルトパッケージです。
パッケージを指定したクラスは、(アーカイブ化していなければ)それぞれの階層がフォルダとして用意された形で保存されます。例えば、jp.hoge.Testならば、「jp」フォルダ内に「hoge」フォルダがあり、その中に「Test.class」が保存されます。が、パッケージ指定していなければ、(階層がありませんから)フォルダなどなく、その場に保存されます。classファイルのある場所が、デフォルトパッケージのクラスが保管されている場所と判断されるわけです。が!「保存されているフォルダがパッケージのことだ」とは思わないでください。これは、ただの「現象」です。たまたま、現在のJavaはそういう形でファイルを保存するようになっている、というだけのことです。パッケージは、あくまで「プログラム上に用意される空間」です。ファイルの保管場所のことではありません。
デフォルトパッケージというものが用意されている理由は、「Javaのクラスは、必ずどこかのパッケージに置かれなければならない」からです。パッケージのないクラスは存在できません。なぜなら、Javaの言語仕様に、パッケージの存在がかかわっているからです。例えば、クラスを定義するのに「public」をつけますが、これが付いていないと「同一パッケージ内についてpublic」と扱われます。つまり、「パッケージ内のクラスとパッケージ外のクラス」で利用が異なるような仕様が文法に既に用意されているのです。このため、必ずクラスはどこかのパッケージに属さなければなりません。それで、まったくパッケージを指定していないものも、デフォルトパッケージというパッケージに所属するという形で扱われるようになっているのです。
この回答への補足
Kyon2_PaPaさま、こちらの質問でもご回答いただきありがとうございました!
>「保存されているフォルダがパッケージのことだ」とは思わないでください。これは、ただの「現象」です。
なるほど!
これはJavaの入門書を読んだだけではなかなか分らないですね~
import文を書くとき、
import文を書いたファイルをコンパイルするとき
カレントディレクトリまたは-dオプションのフォルダからの相対パスでimport文を書かなければならないのでしょうか?
この場合、javax.swing.*;などの標準ライブラリは相対パスにならないですよね? Sun製のrt.jarの。
自作のクラスの場合だけカレントディレクトリまたは-dオプションのフォルダからの相対パスでimport文を書かなければならないのでしょうか?
Sunの標準ライブラリだけ例外?
ソースコードと同じフォルダにあるclassファイルの型のインスタンスを生成する場合、import文や完全名は必要なくて単にクラス名だけでインスタンスを生成できるのですか?
カレントディレクトリにあるソースコードをコンパイル時に-dオプションをつけるとカレントディレクトリではなく-dオプションで指定したフォルダ(このフォルダをAとします)にclassファイルができるのですか?
-dオプションをつけずに-classpathで指定したフォルダのソースコードをコンパイルすると-classpathで指定したフォルダではなくカレントディレクトリ(このフォルダもAとします)にclassファイルができるのですか?
そしてそれぞれソースコードにパッケージ宣言をつけてコンパイルするとAからのパッケージ宣言をした相対位置のフォルダにclassファイルができるのですか?
すいません。よろしくお願いいたします。
No.8
- 回答日時:
>参照、または継承する自作のソースコードをコンパイルするとき
>他人が作ったソースコードの分からないclassファイル、
>jarファイルは参照、または継承する自作のソースコードの
>classファイルの吐き出し先に他人が作ったソースコードの
>分からないclassファイル、jarファイルがコピーされるのですか?
デフォルトパッケージ直下から固められたjarファイルや、他人が作ったソースコードの分からないclassファイルにパッケージ文ない場合
クラスパスで指定した直下に置けば自作のソースコードを
コンパイルの問題はありませんが、
他人が作ったソースコードの分からないclassファイルが
パッケージ文ある場合は、正しく、クラスパスからのパッケージを作成しないと参照された、自作のソースコードはコンパイルエラーになります。
No.7
- 回答日時:
>これは
>参照しているクラス hensuu = new 参照しているクラス();
>とか
>と解釈してよろしいのですよね?
クラス参照するということは、インスタンスを生成するときもそうですが、クラスメソッド(静的メソッド)やクラス変数(スタティック変数)をコールするときも同じです。
>カレントディレクトリにあるソースコードを
>コンパイル時に-dオプションをつけると
>カレントディレクトリではなく-dオプションで
>指定したフォルダ(このフォルダをAとします)に
>classファイルができるのですか?
はい、そうです。
>-dオプションをつけずに-classpathで指定したフォルダの
>ソースコードをコンパイルすると-classpathで指定した
>フォルダではなくカレントディレクトリ
>(このフォルダもAとします)にclassファイルができるのですか?
はい、そうです。
>そしてそれぞれソースコードにパッケージ宣言をつけて
>コンパイルするとAからのパッケージ宣言をした相対位置の
>フォルダにclassファイルができるのですか?
はい、そうです。
この回答への補足
他人が作ったソースコードの分からないclassファイル、jarファイルを参照、または継承する場合「クラスパス中に置いてください」とか言われることがあります。
参照、または継承する自作のソースコードをコンパイルするとき
他人が作ったソースコードの分からないclassファイル、jarファイルは
参照、または継承する自作のソースコードのclassファイルの吐き出し先(自作のソースコードがimoprt文を使ってる場合(つまり他人が作ったソースコードの分からないclassファイル、jarファイルがパッケージ宣言している場合)は参照、または継承する自作のソースコードのclassファイルの吐き出し先からのimoprt文の相対位置)に
他人が作ったソースコードの分からないclassファイル、jarファイルがコピーされるのですか?
No.6
- 回答日時:
さらに深く迷われているような気がしますが
javac -d
は
javac -help
でもわかるように、class ファイルの吐き出し場所を指定するだけで
パッケージに影響しません、パッケージに何も宣言しなければ
どこのディレクトリでコンパイルしてもデフォルトのパッケージなのです
>この場合、hoge2がデフォルトパッケージ。
ディレクトリ=パッケージ
ではありません、コードの上での扱い方の問題です
この回答への補足
hofchanさま、ご回答ありがとうございました!
パッケージ宣言の有無によってclassファイルの吐き出し場所はいろいろ変わるけど
パッケージ宣言の有無にかかわらず
classファイルの吐き出し場所がデフォルトのパッケージなのですか?
import文はimport文を書いたソースコードのコンパイル時のclassファイルの吐き出し場所からの相対パスでクラスなりパッケージなりを指定しなければならないのですか?
Sun製の標準ライブラリは別として。
よろしくお願いいたします。
No.4
- 回答日時:
言葉たらずで申し訳ありませんでした、気になったので横槍かと
思いましたが少し難しく考えられてるようなので
mkdir hoge1 hoge2
cd hoge1
として、ここに(hoge1ディレクトリの中)パッケージの無い
public class hoge1{
public void foo(){
System.out.println("Hello");
}
}
hoge1.javaを作ります、次に
cd ../hoge2
ここに(hoge2 ディレクトリの中)
public class hoge2{
public static void main(String args[]){
hoge1 h = new hoge1();
h.foo();
}
}
これをhoge2.javaとした時
cd hoge1
javac hoge1.java
これは問題無くコンパイル出来ます
今度は
cd ../hoge2
javac hoge2.java
これは当然通りません、しかし最初のコンパイルで出来た
hoge1.class と同じディレクトリに hoge2.java を置くことで
import 宣言も何もなしでコンパイル出来ます、2つとも同じ
デフォルトのパッケージに含まれています
#CLASSPATHに「.」がいるのかな?
当然 davosuke様が言うように、最初のコンパイルで
javac -d ../hoge2 hoge1.java
でもかまいません、デフォルトのパッケージ同士は同じパッケージ
と簡単に考えてもいいと思います
この回答への補足
コンストラクタ側のクラスのコンパイル時に
-dオプションでインスタンス生成側のクラスがあるフォルダを指定するのですね!
この場合、hoge2がデフォルトパッケージ。
もしくはインスタンス生成側のクラスをコンストラクタ側のクラスと同じフォルダに移動orコピーしないといけないのですね!
この場合、hoge1がデフォルトパッケージ。
こんな感じでしょうか?
No.3
- 回答日時:
>デフォルトパッケージはカレントディレクトリのC:\aaaではなく>a.javaが入っているC:\bbbになるのでしょうか?
それは、違います。C:\aaaがデフォルトパッケージです。
javacコマンド実行時にclaspathを指定しても、
コンパイル時にはコンパイル対象javaファイルが参照している
classがclasspath内に存在しないとコンパイルが通りません。
よって、-dオプションにて指定していない場合、
カレントディレクトリのC:\aaaになります。
この回答への補足
>コンパイル対象javaファイルが参照しているclass
これは
参照しているクラス hensuu = new 参照しているクラス();
とか
と解釈してよろしいのですよね?
No.2
- 回答日時:
javaファイルをコンパイルし、classファイルを作成する
javacコマンドはご存知でしょうか??
ご存知なら、以下のa.java,b.java,c.javaをコンパイルしてみてください。
=============== クラスA(a.java) ==============
package a
public class A{
}
=============== クラスB(b.java) ==============
package a.b
public class B{
}
=============== クラスC(c.java) ==============
//コメントパッケージなし
//package a.b
public class C{
}
【実行例】
DOSプロンプトより実行
javac a.java
javac b.java
javac c.java
そしたら、
DOSプロンプトより実行したカレントディレクトリに
配下に
c.class
a(フォルダ)\a.class
a(フォルダ)\b(フォルダ)\b.class
が作成されます。
このようなc.classのようなものをデフォルトパッケージのクラス
といいます。
コンパイル時作成されるパッケージなのですが、何も指定していなければ、どこに作成すればよいか、JAVAコンパイラはわからないので、
デフォルトパッケージを指定します。
結果、デフォルトパッケージとは、
クラスパッケージを作成する基点です。
サンプル例で言いますと、
DOSプロンプトより実行したカレントディレクトリ
になります。
ちなみに
javac -d ディレクトリパス
-d オプションをつけると、
ディレクトリパスがデフォルトパッケージになります。
-dオプションを省略すると、DOSプロンプトより実行したカレントディレクトリになります。
この回答への補足
davosukeさまご回答ありがとうございました!
javacコマンド、存じ上げております。
最近は、統合開発環境の人も多いのでjavacをご存じでない方も多いのでしょうね…
本題に入りますがたとえば(davosukeさまの回答のサンプルとは直接関係なく)パッケージ宣言の無いa.javaがカレントディレクトリ以外のC:\bbbにあったとして
javacのディレクトリに環境変数PATH=を設定済みで
コマンドプロンプトから
C:\>cd C:\aaa
C:\aaa>javac -classpath C:\bbb a.java
と入力したとします。
この場合、デフォルトパッケージはカレントディレクトリのC:\aaaではなくa.javaが入っているC:\bbbになるのでしょうか?
よろしくお願いいたします。
No.1
- 回答日時:
まずパッケージの中に、複数のクラスを含めることが出来ます
そのパッケージのクラスからは、同じパッケージのクラスを呼び出すことが
出来ます
宣言の無いものを簡単に言えば、名前の無いパッケージと考えてください
パッケージ宣言の無い
class hoge{
を
public でなくても呼び出せるのです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux raspberrypi に bluealsaを入れようにも見つからない 1 2023/02/04 10:55
- 医療・安全 「接種証明書」アプリ 他 1 2022/04/13 21:18
- オンラインゲーム パッケージ版VSダウンロード版 あなたはどっち派? 私は、パッケージ版の方が、遊び飽きたら、中古で売 6 2023/02/21 19:17
- IT・エンジニアリング ソフトウェアベンダーのことを調べていて、パッケージとSaaSに分かれているから明確に定義の違いを今一 1 2023/04/20 14:30
- お菓子・スイーツ 牛柄のパッケージのクッキーのお菓子探してます! 3 2023/04/03 12:26
- 数学 分からないので解き方を教えて欲しいです A社で生産されるサッカーボールは,2%が不良品です.サッカー 3 2022/11/07 21:02
- ノートパソコン FileMaker Pro 19 の購入について 3 2022/05/09 07:10
- その他(恋愛相談) 不器用な男性がいて、修正テープが苦手で、綺麗に貼れず、怒られていました。 ネットで使いやすい修正テー 7 2023/02/24 11:12
- その他(生活家電) TO-251の代替パッケージ 2 2022/06/29 09:36
- 数学 最大エントロピー原理をpythonで実装したい 2 2022/06/21 13:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
今日は こどもの日 で、良い天...
-
僕の出身中学校は200人同級生が...
-
unicodeファイルの読み込み
-
SQLです教えてくださいお願いし...
-
恋愛
-
中学生です。 私は教室の黒板に...
-
どこからも呼ばれていない無意...
-
Appletのpublic void paint(Gra...
-
そんなにお金がなくても年に1度...
-
数学の計算問題。 3年間同じク...
-
自分は特に何もしていないのに...
-
修学旅行での演芸大会の出し物...
-
C++でGUIプログラムを作るには?
-
VBAもしくはVB6:クラスの中で...
-
C++での平均値
-
「隣の芝生は青く見える」現象...
-
成人式の後中3のクラスで集まろ...
-
CImageクラスをVisualC++6.0で...
-
他クラスのすごくかっこいい同...
-
共通で使う関数を集めたクラス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じクラスにならない確率を教...
-
そんなにお金がなくても年に1度...
-
河合塾のクラス分けについて
-
今回のクラス替え最悪でした、...
-
3年間同じクラスになる確率
-
java eclipse 型に解決できません
-
恋愛
-
同一パッケージにあるクラスが...
-
小学4年の頃、好きな同級生にス...
-
配列の重複する値とその個数を...
-
main()を持つクラスが2つ以上...
-
EclipseでJSPのコンパイルエラー
-
共通で使う関数を集めたクラス...
-
他クラスのすごくかっこいい同...
-
どこからも呼ばれていない無意...
-
中学生です。 私は教室の黒板に...
-
ネスカフェ エクセラ と UCCク...
-
dllと同じプロジェクトにする方法
-
「隣の芝生は青く見える」現象...
-
コンボボックスのマウスホイー...
おすすめ情報