• ベストアンサー

パッケージについて

Javaのソースの頭にpackage ***** と記述されている場合があります。 そもそもpackageとは何のためにあるのでしょうか? コンパイルするためだけでなく、実行時にも重要な要素なのでしょうか? packageのしくみについてお詳しい方、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

>JAVAはエリアA/Bが基準だということを知らなければなりません。 >これをどのようにしてJAVAに知らせるのでしょうか? これはクラスパスの設定を使います。 クラスパスは、環境変数classpathか、 javacの-classpathオプションで指定します。 詳しくはJava2SDKの「SDKのツール」の部分を見てください。

renann
質問者

お礼

ありがとうごじました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

クラスが一つか二つのプログラムの場合は、パッケージのありがたみが実感できませんが、 世の中には、ひとつのプログラムで、百や千を越えるクラスを使うものもあります。 そういうとき、「この新しいクラスの名前、まだ使ってなかったかな?」 と確認するのは非常に手間がかかります。 パッケージに入れておけば、そういう手間が要りません。 同じパッケージに入っている少数のクラスを見ればいいわけです。 一番の意味は、「大きなプログラムのとき、わかりやすいように」です。 もう一つ、他人が作った既存のクラスを使いやすいようにするためでもあります。 パッケージの命名指針として、「ドメイン名を利用する」というのがあります。 ある人が「abc@def.co.jp」というメールアドレスを持っていたとしたら、 その人は自分用に jp.co.def.abc.*; というパッケージを作って自分の作ったクラスを置きます。 そうすれば他人の作ったクラスとごちゃごちゃになることはなくなります。 世界中のプログラマが協力して作業できます(理論的には)。 パッケージを付けたクラスは、実行時に、パッケージ名をつけて起動しなければなりません。 たとえば、jp.co.def.abcパッケージにTestというクラスを作ったら、実行するときは、 >java jp.co.def.abc.Test と指定してやらなければなりません。(多少面倒ですが)

renann
質問者

補足

回答ありがとうございます。 概念的には良く分かりました。 ただ、Javaはパッケージをどのようにして理解しているのでしょうか? パッケージは言い方を変えればディレクトリ構成になっていると思うのですが、基準ディレクトリがないと意味がない気がするのです。例えばパッケージがC.D.Eとなっていて、プログラムセットが/A/B/C/D/Eエリア(UNIX形式)に入っている場合にこれをコンパイルさせるにはJAVAはエリアA/Bが基準だということを知らなければなりません。 これをどのようにしてJAVAに知らせるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • パッケージ関連のエラー

    パッケージが含まれるプログラムでのエラーの要因は何がありますか? コンパイルはできたんですが、 エラー:メイン・クラスdig.CalcDigを検出およびロードできませんでした。 と表示されます。 何度も見返しましたが、 ソースコードに書かれたパッケージと同じフォルダに入れてある 名前も間違ってない java フォルダ名.メインクラス名で実行している です。

  • Java:packageについて

    いつもお世話になっております。 Javaのpackage機能について教えていただけますでしょうか。 ただいまJavaの勉強中で、本を購入し、それを基にソースを書いたり動かしております。 その中にpackage機能について説明とサンプルソースがあるのですが、 本のまま書いてもエラーで動きません。本とソースを見比べても相違が見られないため 何が原因かも分からず、困っております。 内容 ・Cドライブ直下にwork3というフォルダを作成 ・work3直下にMain.javaを作成する。 ・work3の中にconverterというフォルダを作成する。 ・converterフォルダ内にDollar.javaとEuro.javaを作成する。 ・コマンドプロンプトにてc:\work3に移動し、Javac **.javaを実行後、java Mainを実行する。 コンパイルは成功し、それぞれのclassファイルは作成されております。 実行すると C:\work3>java Main Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: con verter/Main) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: Main. Program will exit. とエラーが出て実行されません。 実際のソースです。 ****************** package converter; public class Dollar {  public static int toYen(int dollar){  return dollar * 90;  } } ****************** package converter; public class Euro {  public static int toYen(int euro){   return euro * 120;  } } ****************** package converter; class Main {  public static void main(String[] args){   System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");   System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");  } } ****************** ちなみにですが、3つのソースはjarファイルの実習で使用し、うまく動いてくれました。 packageの実習でpackage ***を一行追加しただけです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 同一パッケージ内の継承について

    同一パッケージ内で継承したクラス Test2.java をコンパイルすると「シンボルを見つけられません シンボル:クラス Test1」とエラーになります。 --------Test1.java------- package test; public class Test1{ メソッド } ------------------------- --------Test2.java------- package test; public class Test2 extends Test1{ メソッド } ------------------------- Test1.java,Test2.javaとも同一フォルダ(D:\java\test)にあります。 ちなみにカレントディレクトリをD:\java\testにして javac Test2.java でコンパイルしようとしています。 同一パッケージ内のクラスを継承するというのはおかしなことなんでしょうか?また、コンパイルの仕方もあわせてご教示願えれば助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • XMLの構文でJAVAを実行できるパッケージはありますか

    AntとかではなくてJAVAソースコードの変わりにあるXMLのDTDやスキーマを利用してXMLを記述して、JAVAのエンジンを動作させるものってありますか? できれば、パッケージ自体はJAVAで作られたオープンソースフリーウェアだといいです。 できれば、RDBを扱うときも同じようにSQLを扱う代わりにXMLを記述して動作できるものはありますか。

    • ベストアンサー
    • Java
  • packageアクセス修飾子をつけてもよいか?

    アクセス修飾子をつけない場合のデフォルトは「同一パッケージ内からのみアクセスできる」ですが、 修飾子として明示的に「package」というのをつけてもコンパイル、実行はできますでしょうか?

    • ベストアンサー
    • Java
  • アプレットでパッケージ指定した際の実行方法を教えてください。

    タイトルの通りです>< 例えば次のようなプログラムがあったとします。 package draw; import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; /* <applet code="BackGroundColor.class" width="200" height="200"> </applet>*/ public class BackGroundColor extends Applet { public void paint(Graphics g) { setBackground(Color.cyan); setForeground(Color.lightGray); g.fillOval(10, 10, 180, 100); } } 面倒なのでタグはソース内に書き込みます。 これをアプレットビューアで確認するときに appletviewer BackGroundColor.java とやると「アプレットは初期化されていません」と怒られるわけです。 ですが、「package draw;」を消して、コンパイル後、実行すると 見事成功します。 パッケージ指定したときの実行方法を教えてください><

    • ベストアンサー
    • Java
  • パッケージの仕組みについて

    こんにちは。どうもお世話になります。 自分でパッケージを作るとき(あまり作ったことはないのですが、)Aフォルダの下にBフォルダとCフォルダを作ると、そのパッケージにアクセスする時には、A.BもしくはA.*でBフォルダにアクセスできますよね。 しかし、java.awt.event はなぜ、java.awt.* では駄目なのでしょうか? その辺の仕組みについて知りたいです。 誰か分かる方がいましたら、教えてください。よろしくおねがいします。

    • ベストアンサー
    • Java
  • パッケージについて

    Javaのパッケージについてですが、例えばJMFや、javaMailなどの標準で、搭載されていない、パッケージがありますよね。それで、何らかのスタンドアロンプログラムを作った場合、他のマシン(例えば、友達とか)に配布をすると、標準のJRE?環境しかない場合(JRE,javaMailなどのパッケージを入れてない場合)は、そのプログラムを実行できませんよね。この問題を、どうにか解決できるいい方法はないものでしょうか? どうか教えてください。 うまく説明できてなければゴメンなさい。

    • ベストアンサー
    • Java
  • パッケージ内でコンパイルできない

    パッケージを作成して,以下のようなディレクトリ構成にしました. . ├── Sample.java └── vehicle   ├── MiniCar.java   ├── SuperCar.java   └── Vehicle.java vehicleディレクトリ内で $ javac SuperCar.java このようにコンパイルしました.ですが, SuperCar.java:3: シンボルを見つけられません。 シンボル: クラス Vehicle public class SuperCar extends Vehicle { ^ エラー 1 個 このようなエラーが出力されました. 同じディレクトリにあれば,ファイルを見つけに行ってくれると思いましたが, なぜコンパイルできないのでしょうか? #ちなみに,階層を1つ登って #$javac Sample.java #これはコンパイルできて,実行もできました. -- Sample.java -- import vehicle.*; public class Sample {    public static void main(String[] args) {      MiniCar mini = new MiniCar(2);      SuperCar scar = new SuperCar("Red");    } } -- MiniCar.java -- package vehicle; public class MiniCar extends Vehicle {   int num;   public MiniCar(int num) {      super(5,10);      this.num = num;   } } -- SuperCar.java -- package vehicle; public class SuperCar extends Vehicle {   String color;   public SuperCar(String color) {      super(10, 20);      this.color = color;   } } -- Vehicle.java -- package vehicle; public class Vehicle {   private int wheel;   private int wheelDiameter;   public Vehicle(int wheel, int wheelDiameter) {      this.wheel = wheel;      this.wheelDiameter = wheelDiameter;   } }

    • ベストアンサー
    • Java
  • javaのパッケージについての質問です。

    すっきりわかるjava入門という本を参考にjavaを勉強しているのですが、 6.3パッケージを利用する という項目でサンプルコードに従って同じファイルの中に package calcapp.main; public class Calc{ public static void main(String[]args){ int a=10;int b=2; int total=calcapp.logics.CalcLogic.tasu(a,b); int delta=calcapp.logics.CalcLogic.hiku(a,b); System.out.println("足したら"+total+"引いたら"+delta); } } と package calcapp.logics; public class CalcLogic{ public static int tasu(int a,int b){ return(a+b); } public static int hiku(int a,int b){ return(a-b); } } という、二つの違うパッケージに入ったソースコードを作って、コンパイルしてみたのですが、 コマンドプロンプトに、javac CalcLogic.javaと打つ方は上手くいくのですが javac Calc.javaの方はパッケージcalcapp.logicsは存在しません、と言われ上手くいきません。 また、javac CalcLogic.java Calc.javaと打つとコンパイルは上手くいくのですが java Calcはexception in thread"main"java.lang.NoClassDefFoundErrorとでて上手くいきません。 長文の上足りない情報があったりするかもしれませんがわからなくて困っているのでどなたか教えていただけると 助かります。よろしくお願いします。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • Twitter歴半年の音楽アカウントがフォロワーによって鍵アカにされることがあります。応援や共感の気持ちを込めていいねを押しているが、うっとうしいのか心配です。
  • SNSの付き合いは気にしない方が良いのか悩んでいます。半年以上前に彼女をフォローし、頻繁に鍵アカになります。
  • Twitterを利用する方々の意見を聞きたいです。自分の行動がうっとうしいと思われているのかどうか気になります。
回答を見る