プロが教える店舗&オフィスのセキュリティ対策術

すいません。
長い間、
疑問に思ってたことがあるんですけれども、

(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パッケージに入っているものとします。

A 回答 (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です。

この回答への補足

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

補足日時:2001/04/15 10:27
    • good
    • 0

すいません。

少し質問の焦点がつかみづらいですが
以下のように考えると分かりやすいかもしれません。

インポートは使用されるクラスのディレクトリパスを示すだけ(少し違いますが)

質問の例では
extends aiueo を
extends javax.swing.aiueo にすれば
インポート不要。

Aメソッドを使うのであれば継承(extends)は必須。
インポート有無は関係しない。
答えになってますか?

この回答への補足

どこがわからないのか自分でもわからない状態になっていたので、質問がわかりにくかったのかもしれないです。
そこで、よーく考えてみたんですけども、おそらく僕がわからないところというのはここの部分なのかもしれません。(他人事みたいで恐縮ですが)

(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)の場合は当然呼び出せますよね?

補足日時:2001/04/14 11:15
    • good
    • 0

java はあんまり詳しくないのですが、知ってる範囲で。



パッケージと継承は直接関係ないですよ。

あるクラスから派生したクラスを書こうとした場合に、
その元が分からないと駄目なので、そのクラスを持っている
パッケージを import する。

(1) は、クラス Sample が Aメソッドを持っていなければ
コンパイルできない。

(3) は、クラス aiueo が何者なのか分からないので、
コンパイルできない。

(2) は、クラス Sample で Aメソッドを持っていなければ、
クラス aiueo の Aメソッドが呼ばれる。

この回答への補足

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

補足日時:2001/04/14 11:50
    • good
    • 0

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