- ベストアンサー
JAVAのsuperについて教えてください
- JAVAの初心者ですが、superについてよくわかりません。親クラスのコンストラクタの呼び出しや親クラスのオブジェクトの呼び出しについて説明してください。
- コンストラクタとオブジェクトの意味や違いについて教えてください。
- クラスのコンストラクタについても理解が不足しています。クラスとオブジェクトの生成におけるコンストラクタの役割や意味について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
余計かもしれませんが、せっかくなので例を・・・。 例えば、 class SuperClass { public void methodA() { System.out.println("super methodA"); } } class SubClass extends SuperClass { public void methodA() { System.out.println("sub methodA"); } public void methodB() { methodA(); } public void methodC() { super.methodA(); //親クラスのメソッドを呼ぶ } } のようにクラスがあったとして、 methodB は、SubClass の methodA を呼び出し、 methodC は、SuperClass の methodA を呼び出します。 下記のように実行すると、動作はお分かりいただけるかと思います。 SubClass foo = new SubClass(); foo.methodA(); //sub methodA を出力 foo.methodB(); //sub methodA を出力 foo.methodC(); //super methodA を出力
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
スーパークラスのメソッドをオーバーライドするときに, 「オーバーライドしたメソッドの中でスーパークラスの同名のメソッドを実行したい」ということがあったりします. そのときに super を付けるとスーパークラスを起点としてメソッドを探すので期待した動作となりますが, super を付けないと自分のクラスを起点にメソッドを探すのでうまくいきません.
- _etnl
- ベストアンサー率100% (4/4)
コンストラクタについて >・そもそもクラス(オブジェクトの生成)にとってどのような役割、意味があるのでしょうか。 コンストラクタはオブジェクトを生成するための特殊なメソッドです。 コンストラクタを呼び出すことによってオブジェクトを生成します。 なので >オブジェクトの生成すると、デフォルトで自動的に引数なしのコンストラクタが作成される というのは誤りです。 正しくは 「コンストラクタがないクラスを定義すると、引数無しのコンストラクタ(=デフォルトコンストラクタ)がコンパイラによって自動的に作成される」といったところでしょう。 >・作成されること自体にどのような意味があるのでしょうか。 自動的に作成されることによって、コンストラクタを定義しなくてもオブジェクトを生成することができます。 superについて superキーワードには二つの意味があるということです。 それが ・親クラスのコンストラクタ呼び出し ・親クラスのオブジェクトの参照 です。 一つ目の意味では、子クラスのコンストラクタから親クラスのコンストラクタを呼び出す際に用います。 二つ目の意味では、親クラスのメソッドをオーバーライドした場合に、親クラスのメソッドを呼び出す場合などに用います。 引用されたAPIドキュメントは「paintメソッドをオーバーライドした場合は親クラスのpaintメソッドを呼び出す必要がある」ということを述べています。
お礼
_etnlさん、回答ありがとうございます。 >・親クラスのオブジェクトの参照です。 >・・・・・・・・・・・・・・・・・ >二つ目の意味では、親クラスのメソッドをオーバーライドした場合に、親クラスのメソッドを呼び出す 場合などに用います。 ここの箇所について再度質問ですが、普通は、親クラスのメソッドをオーバーライドする場合には、 そのまま、super.をつけずにメソッドを呼び出すだけではないでしょうか? 一部のsuper.paintComponent()のような場合には、super.がつくメソッドの呼び出しがあるようですが、 むしろこのケースは特別の場合と考えるのでしょうか?? 再度宜しくお願いします。
補足
回答ありがとうございます。 ある本には下のようなコードがありました、superをコメントにしても 動きますが、何故このコードのこの箇所でsuperが必要なのでしょうか。 それともこのコードは間違いなのでしょうか。 色々と回答をもらって他の参考書などでも勉強しましたが、どうしても superの使い方、意味が理解できません、再度宜しくお願いいたします。 ========================================================================== class MyPanel1 extends JPanel implements Runnable { Thread th ; int x = 10 , y = 10 ; int vx , vy ; int w , h ; MyPanel1() { // super(); this.vx = 1 ; this.vy = 1 ; th = new Thread(this) ; th.start(); } public void run() { while(true) { w = getWidth() - 10 ; h = getHeight() - 10 ; if( x <= 0 || x >= w) { vx = -vx ; } if(y <=0 || y >= h) { vy = -vy ; } x += vx ; y += vy ; repaint() ; try { Thread.sleep(20); } catch(InterruptedException e) { return ; } } } public void paintComponent(Graphics g) { super.paintComponent(g) ; g.setColor(Color.red); g.drawOval( x , y , 10 , 10 ) ; } } public class ThreadPaneltest { public static void main(String[] arg) { JFrame f = new JFrame("f.getContentPane()"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ; f.setSize(200,200); Container c = f.getContentPane(); MyPanel1 p = new MyPanel1(); c.add(p); f.setVisible(true); } }
お礼
ありがとうございました、もう少し自分でも勉強してみます。