はじめての親子ハイキングに挑戦!! >>

 Java「デフォルトのパッケージ」の意味が分かりません。
http://takeoba.cool.ne.jp/java/packageDeclaratio …


パッケージ宣言しないプログラムは、デフォルトのパッケージに割り当てられます。

と書かれているのですが「デフォルトのパッケージ」の意味が分かりません。
 Googleで「Java デフォルトのパッケージ」を検索してもヒットする件数は多いのですが「デフォルトのパッケージ」の意味そのものに触れたものがなかなか見つかりません。
 Javaに詳しい方、よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

なんというか、パッケージを「クラスファイルの保存場所」と思われてしまうとまずいので、微妙に追加を。



まず、パッケージというのは何のためのものか、それをご理解ください。これは、クラスファイルの保存場所に関するものではありません。パッケージというのは、クラスに名前空間を与え管理するためのものです。わかりやすくいえば、ファイルをフォルダで分類して整理できるのと同じように、すべてのクラスを、場所を指定して管理できるようにするための仕組みのことです。

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ファイルができるのですか?

 すいません。よろしくお願いいたします。

補足日時:2007/04/20 00:34
    • good
    • 0

>参照、または継承する自作のソースコードをコンパイルするとき


>他人が作ったソースコードの分からないclassファイル、
>jarファイルは参照、または継承する自作のソースコードの
>classファイルの吐き出し先に他人が作ったソースコードの
>分からないclassファイル、jarファイルがコピーされるのですか?
デフォルトパッケージ直下から固められたjarファイルや、他人が作ったソースコードの分からないclassファイルにパッケージ文ない場合
クラスパスで指定した直下に置けば自作のソースコードを
コンパイルの問題はありませんが、
他人が作ったソースコードの分からないclassファイルが
パッケージ文ある場合は、正しく、クラスパスからのパッケージを作成しないと参照された、自作のソースコードはコンパイルエラーになります。
    • good
    • 0
この回答へのお礼

 みなさま、ありがとうございました!!
とても参考になりました!!

お礼日時:2007/05/07 16:12

>これは


>参照しているクラス 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ファイルがコピーされるのですか?

補足日時:2007/04/21 13:57
    • good
    • 0

さらに深く迷われているような気がしますが



javac -d



javac -help

でもわかるように、class ファイルの吐き出し場所を指定するだけで
パッケージに影響しません、パッケージに何も宣言しなければ
どこのディレクトリでコンパイルしてもデフォルトのパッケージなのです

>この場合、hoge2がデフォルトパッケージ。

ディレクトリ=パッケージ
ではありません、コードの上での扱い方の問題です

この回答への補足

 hofchanさま、ご回答ありがとうございました!
 パッケージ宣言の有無によってclassファイルの吐き出し場所はいろいろ変わるけど
パッケージ宣言の有無にかかわらず
classファイルの吐き出し場所がデフォルトのパッケージなのですか?

import文はimport文を書いたソースコードのコンパイル時のclassファイルの吐き出し場所からの相対パスでクラスなりパッケージなりを指定しなければならないのですか?
Sun製の標準ライブラリは別として。
 よろしくお願いいたします。

補足日時:2007/04/20 00:46
    • good
    • 0

言葉たらずで申し訳ありませんでした、気になったので横槍かと


思いましたが少し難しく考えられてるようなので

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がデフォルトパッケージ。

こんな感じでしょうか?

補足日時:2007/04/19 23:02
    • good
    • 0

>デフォルトパッケージはカレントディレクトリのC:\aaaではなく>a.javaが入っているC:\bbbになるのでしょうか?



それは、違います。C:\aaaがデフォルトパッケージです。
javacコマンド実行時にclaspathを指定しても、
コンパイル時にはコンパイル対象javaファイルが参照している
classがclasspath内に存在しないとコンパイルが通りません。
よって、-dオプションにて指定していない場合、
カレントディレクトリのC:\aaaになります。

この回答への補足

>コンパイル対象javaファイルが参照しているclass

これは

参照しているクラス hensuu = new 参照しているクラス();

とか

と解釈してよろしいのですよね?

補足日時:2007/04/19 22:53
    • good
    • 0

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になるのでしょうか?

 よろしくお願いいたします。

補足日時:2007/04/17 15:29
    • good
    • 0

まずパッケージの中に、複数のクラスを含めることが出来ます


そのパッケージのクラスからは、同じパッケージのクラスを呼び出すことが
出来ます

宣言の無いものを簡単に言えば、名前の無いパッケージと考えてください
パッケージ宣言の無い
class hoge{

public でなくても呼び出せるのです
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q無名パッケージからのインポート

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の初学者です。

無名パッケージ内のクラスを、他のパッケージ中から呼びたいのですが、うまくいきません。

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);
...続きを読む

Aベストアンサー

デフォルトパッケージ内のクラスはインポート出来ません。

>Test2/src/Test2.java
>----
>import Test;
>public class Test2 {
>public static void main(String[] args) {
>Foo foo = new Foo();
>System.out.println(foo.m1);
>}
>}
>----

これって本当にコンパイルとおりますか?
当方の環境では、import宣言でエラーになります。
このコードの場合、同パッケージ内なのでインポートしなくてもTestクラスを参照することはできます。
実際はimport宣言していないのではないでしょうか。

リフレクションを使えばデフォルトパッケージ内のクラスを参照できるみたいですが、
素直にTestクラスをパッケージに入れたほうがいいのではないかと思います。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q「httpステータス404」というエラーが出ます。

「httpステータス404」というエラーが出ます。

java初心者です、宜しくお願い致します。
EclipseでServletを書いてやりましたが、以下のようなエラーが出ます、
原因はなんでしょうか、宜しくお願い致します。
「httpステータス404-/Servlet%E7%B7%B4%E7%BF%92/ ServOutput」

Aベストアンサー

Not Found
という意味です。
そのファイルが無い。あるいはリンクが間違っています。
詳しくは参考URLをみてください。

参考URL:http://ja.wikipedia.org/wiki/HTTP_404

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

Q自作のクラスファイルがインポート出来ない

ご質問させて頂きます。

自作のクラスファイルがインポート出来ないので困っています。

自作のクラスファイルがある場所
c:\ja

クラスファイル名
TestMap.class

juko.javaにこのようにインポートして、
import TestMap.*;

以下のようにインポートをしようとすると、
C:\ja>javac -d c:\ja juko.java

以下のようなエラーになってしまいます。
-----------------
jukou.java:7: パッケージ TestMap は存在しません。
import TestMap.*;
-----------------

なお、環境設定も以下のように変更してみましたが駄目でした。
CLASSPATH=C:\ja;.;C:\j2sdk1.4.1_02\lib\tools.jar;C:\Program Files\Allaire\JRun\l
ib\ext\servlet.jar;C:\mysql-connector-java-3.1.0\mysql-connector-java-3.1.0-alph
a-bin.jar;

ご教授して頂けたら幸いです。

ご質問させて頂きます。

自作のクラスファイルがインポート出来ないので困っています。

自作のクラスファイルがある場所
c:\ja

クラスファイル名
TestMap.class

juko.javaにこのようにインポートして、
import TestMap.*;

以下のようにインポートをしようとすると、
C:\ja>javac -d c:\ja juko.java

以下のようなエラーになってしまいます。
-----------------
jukou.java:7: パッケージ TestMap は存在しません。
import TestMap.*;
---------------...続きを読む

Aベストアンサー

おお
そこまでいったってことはimportについては解決したようですね。


TestMap("B") ;
は参照になっていません。
クラス名("B")はコンストラクタにStringの"B"を渡しているということになっているからです。

試しにTestMapクラスに
public String getStr(){
return "呼ばれてますよ!"
}
を追加してみてください。

これで"呼ばれてますよ!"がとれれば大丈夫!!

Qeclipseのパッケージって何?

Java&Eclipse初心者です。
eclipseのクラス作成時に、パッケージと言う項目がありますが
何を入力すればいいのでしょうか?(パッケージって何?)
とりあえず、空白のままにしたら「デフォルト・パッケージの使用は推奨されません。」と表示されますが、問題はないのでしょうか。

Aベストアンサー

パッケージとは、クラスのまとまりです。関連のあるクラスをひとつにまとめてパッケージとします。意味のあるまとまりとして扱いやすくするのと、別のパッケージであれば同じ名前のクラスが作れるという名前空間の整理のためにあります。
指定しなければデフォルトパッケージ(パッケージなし)となります。

パッケージはどんな入門書でも必ず説明がありますから、しっかり勉強してください。基本中の基本ですし、重要な概念です。

QEclipse・プロジェクトで、フォルダをパッケージとして認識する

Eclipseを使っているのですが、
プロジェクトを立ち上げたときに、
普通フォルダをちゃんとパッケージとして認識してくれるのですが、パッケージのアイコンが普通のフォルダのアイコンの形をしたままでパッケージとして認識してくれないことがあります。

このとき、左のパースペクティブ(フォルダとかのツリー図)には.classファイルも.javaファイルと一緒に出てきます。

コンパイルはしているようですが、エラーの×印などが出てきません。


パッケージをパッケージとして認識してほしいので、アイコンがフォルダの絵からパッケージのアイコンになった状態にしたいのですが、どのようにすればよいでしょうか?

わかりにくい説明で申し訳ありませんが、もしわかりましたら教えていただけますと助かります。

Aベストアンサー

こんにちは。

左側に多分アイコンがあると思います。
(なければファイルにプラスマークがついたアイコンをクリックしてください)
それのファイルの絵がついているアイコン(リソース)と書かれている状態ですと、アイコンがフォルダで表示されますし、classファイルも一緒に表示されます。

Jというマークがついているアイコン(JAVA)を選択すると、ご希望のパッケージとして表示されます。

少し分かりにくくてすみません。
分からなかったらもう一度聞いてください。
頑張って分かりやすく説明できるようにしたいと思います


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング