• ベストアンサー

あれ?

すいません。 長い間、 疑問に思ってたことがあるんですけれども、 (1) import javax.swing.*; class Sample {  public static void main (String args[])  {   ........   Aメソッド()  } } (2) import javax.swing.*; class Sample extends aiueo {   public static void main (String args[])  {   ........   Aメソッド()  } } (3) class Sample extends aiueo {  public static void main (String args[])  {    ........   Aメソッド()  } } の違いが、 考えれば考えるほどわからなくなってきました。 パッケージと継承の関係について、 どうやら理解できていないみたいです。 どなたか分かりやすく教えてください。 よろしくお願いします。 (注) Aメソッドはaiueoクラスのメソッドとし、 aiueoクラスはjavax.swingパッケージに入っているものとします。

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

  • ベストアンサー
  • ct27
  • ベストアンサー率62% (48/77)
回答No.3

まず、最初に(1)と(2)の違いからみてみましょう。 Javaの世界では(1)をアプリケーションと呼んでいます。public static void mainと いうものを呼んでいるからです。これを書くことによってDOSプロンプトから java Sample1 って書くとコンパイルしたこのプログラムが動き出します。動きとしては myFrameをnewしますよという動きになります。(これはJavaの決まりごとです) さてさて(2)ですが、こちらはJFrameを継承して作った新しいクラスになります。 JFrameの機能だけじゃものたりないからもうちょっと機能を足したいなと言うときに JFrameの機能をもった新しいクラスを自分で作成するといった感じです。 なのでコンパイルはできますが、(1)と違ってjavaコマンドを使っても実行できません。 >JFrameクラスを拡張していないにもかかわらず、どうしてJFrameクラスを使うことができるんでしょうか  import javax.swing.*; ってやっているからですね。  importはどこどこにあるこのクラスの場所を教えるから使えるようにしてねという意味です。  JFrameはjavaxという箱の中に入っているswingという箱の中に入っています。ご存知かもしれませんが  *はswingという箱の中に入っているクラス全部使えるようにしてねという意味です。 >拡張していなくてもインポートしていれば、そのクラスのオブジェクトを作ることは可能なのでしょうか  ということでこの質問はまさにそのとおりです。逆の言い方をすればクラスをどこかに書くときは  そのクラスの場所を教えてあげないと(importしないと)いけませんということです。 >この(1)の場合、JFrameクラスのメソッドを呼び出すことは可能でしょうか?  もちろん可能ですよ。JFrame myFrame = new JFrame("窓");で、myFrameというインスタンスを  作りましたから、myFrame.メソッド名でOKです。

fumi11
質問者

補足

ようやく謎が解けました。 とてもわかりやすかったです。 本当にありがとうございました。

その他の回答 (2)

  • Google
  • ベストアンサー率20% (1/5)
回答No.2

すいません。少し質問の焦点がつかみづらいですが 以下のように考えると分かりやすいかもしれません。 インポートは使用されるクラスのディレクトリパスを示すだけ(少し違いますが) 質問の例では extends aiueo を extends javax.swing.aiueo にすれば インポート不要。 Aメソッドを使うのであれば継承(extends)は必須。 インポート有無は関係しない。 答えになってますか?

fumi11
質問者

補足

どこがわからないのか自分でもわからない状態になっていたので、質問がわかりにくかったのかもしれないです。 そこで、よーく考えてみたんですけども、おそらく僕がわからないところというのはここの部分なのかもしれません。(他人事みたいで恐縮ですが) (1) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Sample1{ public static void main (String args[]){      JFrame myFrame=new JFrame("窓")  ..... (2) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Sample1 extends JFrame{ ..... (1)ではJFrameクラスのオブジェクトを作成していますが、JFrameクラスを拡張していないにもかかわらず、どうしてJFrameクラスを使うことができるんでしょうか? もしかして、拡張していなくてもインポートしていれば、そのクラスのオブジェクトを作ることは可能なのでしょうか?また、この(1)の場合、JFrameクラスのメソッドを呼び出すことは可能でしょうか?(2)の場合は当然呼び出せますよね?

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

java はあんまり詳しくないのですが、知ってる範囲で。 パッケージと継承は直接関係ないですよ。 あるクラスから派生したクラスを書こうとした場合に、 その元が分からないと駄目なので、そのクラスを持っている パッケージを import する。 (1) は、クラス Sample が Aメソッドを持っていなければ コンパイルできない。 (3) は、クラス aiueo が何者なのか分からないので、 コンパイルできない。 (2) は、クラス Sample で Aメソッドを持っていなければ、 クラス aiueo の Aメソッドが呼ばれる。

fumi11
質問者

補足

あー、もうちょっとでわかるような気が・・。 なにぶん自分でもどこがわからないのかがわからない状態なので、a-kumaさんにはご迷惑をかけてしまったかもしれませんね。でも、とっても参考になりました。本当にありがとうございました。

関連するQ&A