• ベストアンサー

packageとimport の違いって?

packegeって、クラスやインタフェースの集まりなんですよね?で、import文で参照できるようにするんですよね?でも、package~ってソースの冒頭に書く事ってありますよね。でもその後にもimport~って続いて・・・何かpackage~とimport~って明確に使い分けないといけない理由があるのでしょうか?教えてください。

  • Java
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • sasadora
  • ベストアンサー率68% (59/86)
回答No.2

packageは、そのクラスのパッケージを指定しています。 importは、自分の属するパッケージ以外のほかのパッケージを使用する場合に使います。 例1:パッケージ名「hoge.moge」クラス名「MyClass」 package hoge.moge.MyClass; class MyClass{ } 例2:パッケージ名「hoge.moge」クラス名「MyClass」が  別パッケージ「hoge2.moge2」クラス「OtherClass」を使用する場合。 package hoge.moge.MyClass; import hoge2.moge2.OtherClass; class MyClass{   OtherClass oc; } 例2は、import文を使用しなくても、次のように書き換えることができます。 package hoge.moge.MyClass; class MyClass{   hoge2.moge2.OtherClass oc; } でも、これだと何度も記述するのが面倒くさいですよね? そのためにimport文を使用して、「自パッケージ外のクラスについては、ここから探してね」とコンパイラに指示していることになります。

kohiro
質問者

補足

有り難うございます。だからpackageは絶対一つだったんですね!目から鱗でした。 でも、補足で教えてください。package文がないソースってありますよね。どうなるのですか?自分のいるクラスがどのpackageか分からないですよね?よろしくお願いします。

その他の回答 (3)

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.4

ごめんなさい。私の経験的には、No3で書いたとおりなんですが、 厳密にはちょっと違うようです。 ちゃんとした定義は、Java言語仕様で確認したほうがよいです。 紹介するURLは、Java言語仕様の日本語訳です。 これによると、名前なしパッケージは、1つ以上存在することもあって、 どの名前なしパッケージを使うかはホストシステムによって決まるそうです。 一時的な開発時などに、名前なしパッケージを使うことを勧めているので、 「名前なしパッケージは常にインポートされている」という考え方は、 間違っていたと思います。 (経験的にはいつもひとつのパッケージしか使われないように思いましたが)

参考URL:
http://www.y-adagio.com/public/standards/tr_javalang/7.doc.htm#26619
kohiro
質問者

お礼

有難うございました!! これからもよろしくお願いします。 紹介していただいたURLでも勉強してみます。

  • sasadora
  • ベストアンサー率68% (59/86)
回答No.3

パッケージ名を指定していないクラスは、 「名前なしパッケージ」に属していると言えます。 一般的には、名前なしパッケージは一番上階層のパッケージだと思っていいと思います。 コンパイルした場合は、出力ディレクトリのルートに作成されます。 じゃあ、コンパイラはどうやってパッケージ名のついていないクラスを見つけ出すのか? →名前なしパッケージは常にインポートされていると考えていいと思います。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

package は、そのファイルに記述されているクラスが、どのパッケージに属するか、の宣言です。 import は、使おうと思っているクラスの(パッケージを含めた)宣言です。 「明確に使い分けないといけない」もなにも、意味が違います。 ■クラス CCC のソース package aaa.bbb; // クラス CCC を使うときには、import aaa.bbb.CCC って使ってね class CCC { ■クラス CCC を使っているソース import aaa.bbb.CCC; class XXX { # 伝わりますか?

関連するQ&A

  • importとextendsの用い方の違いは?

    importとextendsというのはどちらも他のクラスを参照するという意味で同じように感じられます。 extendsだとメソッドのオーバライドが出来る、 importだと異なったパッケージからでも参照出来る、ということ以外に何か使うにあたって区別すべきポイントはあるのでしょうか?

    • ベストアンサー
    • Java
  • JSPで独自のパッケージがimportできません。

    下記構成で、test.jspで、作成したjp.test.utilパッケージをimportして使いたいのですがうまくいきません。 ■Tomcat4.1 |_■webapps  |_■test   | ■JSP   | |★test.jsp   |   |_■Web-inf     |_■classes      |_■jp       |_■test        |_■util         |★OrgDataFormat.class ★test.jspに、 <%@ page import="jp.test.*" %> と記述しても、下記エラーとなりimportできません。 パッケージ jp.test は存在しません。 import jp.test.*; オリジナルパッケージをimportするには、 どこにどのような設定が必要なのでしょうか? 環境はWinXP,Tomcat4.1.18,JDK1.4.1を使っています。

    • ベストアンサー
    • Java
  • import文の必要性

    Javaを勉強しているものです。 import文について質問させてください。 教材に、「java.langパッケージ以外のパッケージを利用する場合は、必ずimport文が必要です。」と記載されていました。 しかし、パッケージ名を含めたクラスのフルパスを記述すればimport文は、langパッケージに限らず、すべて不要なのではないのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java
  • eclipseによるjavaのimportは?

    eclipse3.4でwarファイルのimportをするとできあがったディレクトリはsrcのパッケージ以下がimportされないのですが、なぜでしょうか?その他のjspなどはimportされています。src直下のパッケージ名以下のソースが空っぽなんです。。 exportの方法に問題があるのですか?ソースは普通のサーブレットとjavaクラスのものです。

    • ベストアンサー
    • Java
  • import文はルートクラス指定とサブクラス指定では処理・モジュールサイズに影響?

    ■質問1: import文はルートクラス指定とサブクラス指定では処理・モジュールサイズに影響するのでしょうか? 例えば、 (A)import java.util.Date; と (B)import java.util.*; では、何かしらの変化があるのでしょうか? import文はコンパイル時のクラスライブラリへの参照、という意味では コンパイル速度への影響は考えられますが、実処理へは、、、どうなのでしょうか? またこのことによるモジュールサイズには影響がおこりえますか? (import文一行では変化がないかもしれませんが、大量の場合) ご存知なかたいらっしゃいましたら、是非教えて頂けますようよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 無名パッケージからのインポート

    Javaの初学者です。 無名パッケージ内のクラスを、他のパッケージ中から呼びたいのですが、うまくいきません。 Test/src/Test.java ---- public class Test { public int m1; public Test() { m1 = 1; } } ---- という既存のプロジェクトがあるとします。 このプロジェクト内のTest.javaを利用したいと考えたとき、例えば、 Test2/src/Test2.java ---- import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- はうまくいきます。 ですが、Test2プロジェクトを Test2/src/test2/Test2.java ---- package test2; import Test; public class Test2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.m1); } } ---- のようにするとうまくいきません。 package test2の中から、外の無名パッケージのTestクラスを使用するには、どのようにすればよいでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 無名パッケージのクラス

    パッケージ化されたクラス(pacA.ClassA)から、無名パッケージ(ClassB)のクラスを参照できるのでしょうか。 状況を詳しく書きますと、 ClassB はコンパイル済みで、pacA.ClassA の中で ClassB を new しています。 pacA.ClassA をコンパイルしたいのですが、ClassB を import できません(コンパイルエラー)。 それとも、ClassB は import する必要がなく、単に私のコンパイルの仕方(classpathの通し方等)が悪かったのでしょうか。 どなたか教えて頂けませんか。

    • ベストアンサー
    • Java
  • importしたパッケージが見つからない!

    Javaで形態素解析を行おうとしてもエラーがでます。 importしたクラスがみつかないとのことです。 配布先のHPに 「java の CLASSPATH に sen.jar と commons-logging.jar が必要。」 と書いてあったので、環境設定のCLASSPATHのところに sen.jarとcommons-logging.jarを C:\sen-1.2.2.1\lib\sen.jar; C:\sen-1.2.2.1\lib\commons-logging.jar; と加えました。 それ以外は特にしていません。 一応、サンプルプログラムは import net.java.sen.StringTagger; import net.java.sen.Token; public class SenTest { public static void main( String args[] ) { try { String path="C:\\sen-1.2.2.1\\conf\\sen.xml"; StringTagger tagger = StringTagger.getInstance( path ); String word = chiroLib.inputWord("語を入力してください。"); Token[] token = tagger.analyze( s ); if (token != null) { for ( int i = 0 ; i < token.length ; i++ ) { System.out.println( token[i].getTermInfo() ); } } } catch (Exception e) { e.printStackTrace(); } } } で、発生するエラーは SenTest.java:1: パッケージ net.java.sen は存在しません。 import net.java.sen.StringTagger; ^ SenTest.java:2: パッケージ net.java.sen は存在しません。 import net.java.sen.Token; ^ といったものです。。。 ご教授ください。。。

  • packageとimportの関係のコンパイルエラー

    現在JAVAの勉強をしております。 サンプルソースを入力しながら行っております。 カレントディレクトリでコンパイルは正常にできました。 しかし、「packageとimport」の処理を追加しファイルを ディレクトリに移したところうまくコンパイルが通らなく なりました。 パスの間違えかとも思いつつ色々調べているのですが、原因 がつかめません。 検索サイトを使って色々な事例を見てみたのですが、解決 出来ませんでした。 すみませんが、ご指導のほどお願いします。 詳細は下記の通りです。 漏れなどありましたらご指摘していただければ補記します。 JDK:1.3.1 OS:Windows2000ProSP2 ------------------------------------------------------ ディレクトリ D:\JAVAPRESS └─jp └─co └─gihyo └─javapress ├─test │ ATMTest.java │ └─account Account.java CommissionAccount.java コンパイル D:\JavaPress\jp\co\gihyo\javapress\test>javac -classpath D:\JavaPress\Account ATMTest.java ATMTest.java:2: シンボルを解釈処理できません。 シンボル: クラス ATMFrame 位置 : atm の パッケージ import jp.co.gihyo.javapress.atm.ATMFrame; パッケージ ATMTest.javaの内容 package jp.co.gihyo.javapress.test; import jp.co.gihyo.javapress.atm.ATMFrame; import jp.co.gihyo.javapress.account.*; class ATMTest { Account.javaの内容 package jp.co.gihyo.javapress.account; public class Account {

    • ベストアンサー
    • Java
  • アプレットと自作パッケージのimportについて

    以下のような、アプレットのプログラムを作ったのですが、コンパイルは通るのですが、アプレットの初期化のところで止まってしまいます。理由と解決策を教えてください。 javac dev_java\TargetApplet\*.java ← これはOK appletviewer dev_java\TargetApplet\TargetApplet.java ←init() で止まる。 (ソース一部抜粋) package dev_java.TargetApplet ; import java.applet.* ; import java.awt.* ; import java.awt.event.* ; import dev_java.Target.* ;  // 自作のpackage /* <applet code="TargetApplet" width=500 height=400> </applet> */ public class TargetApplet extends Applet implements ActionListener, TextListener{ TextField Word ; TextField Mean ; TextArea Result ; Button Search ; Button Entry ; EnglishDictionary ed ; /* 自作package dev_java.Target で宣言されているクラス*/ public void init() { Word = new TextField(20) ; Mean = new TextField(20) ; Search = new Button("Search") ; Entry = new Button("Entry") ; Result = new TextArea(20,40) ; Word.addActionListener(this) ; Word.addTextListener(this) ; Mean.addActionListener(this) ; Mean.addTextListener(this) ; Search.addActionListener(this) ; Entry.addActionListener(this) ; // EnglishDictionary ed = new EnglishDictionary("dic/Target1900.dic") ; this.add(Word) ; this.add(Mean) ; this.add(Search) ; this.add(Entry) ; this.add(Result) ; } }

    • ベストアンサー
    • Java