• ベストアンサー

初心者ですがコンストラクターについて質問

swingを現在勉強中なのですが、とりあえずコンポーネントを作成する部分で、以下のようなソースを書きました。 JPanel p1 = new JPanel(); p1.setPreferredSize(new Dimension(100, 100)); Border border = new BevelBorder(BevelBorder.RAISED); p1.setBorder(border); 4行目ですが、コンストラクターを呼び出してインスタンス化する場合にBorderオブジェクト型になっているのですが、素人の私には BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); にならないのはなぜ?と思ってしまいます。APIをみればsetBorderメソッドがBorderオブジェクトを引数にもつ事は理解できますが、コンストラクターの部分はいまいち理解できません。初歩的な質問ですが、教えていただけないでしょうか?

  • 3java
  • お礼率25% (4/16)
  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.2

>インスタンス化とキャストを同時にしている その理解でよいと思いますが、細かいことが気になる方だと見受けましたので、ご参考までに「Java言語規定」での定義に従うと、厳密には: Border border = (Border)bevelborder; これは「キャスト変換」 http://www.y-adagio.com/public/standards/tr_javalang/5.doc.htm#20232 Border border = new BevelBorder(BevelBorder.RAISED); これは「代入変換」 http://www.y-adagio.com/public/standards/tr_javalang/5.doc.htm#170768 BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); これは「メソッド呼出し変換」 http://www.y-adagio.com/public/standards/tr_javalang/5.doc.htm#12687 となると思います。 >BevelBorderクラスはBorderクラスのサブクラス 「BevelBorderクラスはBorderインタフェースを実装する」が、正確な表現です。 >これはAbstractBorderにimplementsされているので実際には >AbstractBorder内のBorderクラスでキャストしている事になるのですか 「AbstractBorder内のBorderクラス」という表現が若干気になりますが、多分理解されています。 ご参考までに、これも「Java言語規定」の「スーパインタフェース」 http://www.y-adagio.com/public/standards/tr_javalang/8.doc.htm#34031 に従うと、 ・BorderインタフェースはAbstractBorderクラスの「直接的スーパインタフェース」である ・AbstractBorderクラスはBevelBorderクラスの「直接的スーパクラス」である したがって、 ・BorderインタフェースはBevelBorderクラスの「スーパインタフェース」である すなわち ・BevelBorderクラスはBorderインタフェースを実装する となるかと思います。 上記「代入変換」の頁には以下のように書いてありますので、変換が可能という結論になります。 引用開始>>>> コンパイル時参照型 S(代入元)の値のコンパイル時参照型 T(代入先)への代入は,次のように検査する。 (中略) T がインタフェース型ならば, T は S と同じインタフェース又は S のスーパインタフェースでなければならない <<<<引用終了 TがBorder、SがBevelBorderですね。 ・・・と、くどくどと書きましたが、 BevelBorderはBorderである(is-a関係) わけですから、Border型の変数にBevelBorderのインスタンスが突っ込まれることは極自然なことです。 逆の場合はそうとは限りません(BorderはBevelBorderとは限らない)ので、明示的なキャスト変換が必要になります。代入変換やメソッド呼出し変換はできません。 BevelBorder bevel = (BevelBorder)border;//borderはBorder型

参考URL:
http://www.y-adagio.com/public/standards/tr_javalang/index.htm

その他の回答 (2)

  • kztk
  • ベストアンサー率53% (59/110)
回答No.3

#2です。コピペミスのため、訂正します。 >BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); >これは「メソッド呼出し変換」 正しくは、 BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); p1.setBorder(border); これは「メソッド呼出し変換」

3java
質問者

お礼

親切ご教授して頂き有難うございました。 納得いく説明でしたのですっきりしました。 文中の参考urlをもとにもっと勉強してみます。

noname#49664
noname#49664
回答No.1

Border border = new BevelBorder(BevelBorder.RAISED); BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); どっちでもいいです。好きにしてください。 setBorderするのは、Borderクラス(またはそれを継承したクラス)です。で、BevelBorderはBorderクラスを継承して作ったサブクラスです。 ですから、これは単純に「BevelBorderを変数に収める際にBorderにキャストしてからsetBorderする」か、あるいは「BevelBorderを変数に収め、setBorderする際にBorderにキャストする」か、どっちかということです。以下のような感じですね。 Border border = new BevelBorder(BevelBorder.RAISED);←ここでキャスト p1.setBorder(border); BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); p1.setBorder(border);←ここでキャスト どっちにしろ、要するに「BevelBorderをどこかでBorderにキャストしてsetBorderする」ということに変わりはありません。

3java
質問者

補足

ご教授有難うございました。 以下実行して正常に動作しました。 BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); Border border = (Border)bevelborder; p1.setBorder(border); 言われるとおり、インスタンス化とキャストを同時にしている事がよくわかりました。確かにBevelBorderクラスはBorderクラスのサブクラスですね。あともう少し教えて頂きたいのですが、APIをみるとBorderクラスはinterfaceクラスです。これはAbstractBorderにimplementsされているので実際にはAbstractBorder内のBorderクラスでキャストしている事になるのですか?それともクラスのキャストは別にinterfaceだとかはあまり気にしないでクラスはクラスということなのでしょうか?ど素人なのでとんでもない事をいってるかも知れませんが、よろしくお願いします。

関連するQ&A

  • javascriptのObject()コンストラクタについて質問です。

    javascriptのObject()コンストラクタについて質問です。 var obj = new Object(); var obj2 = Object(); console.log(obj === obj2)//false いつも質問ばかり恐縮です。。。 どこかのサイトでこの2つは等価みたいな記事を読んだような気がするのですが、 ということはObjectコンストラクタでオブジェクトを作る際はnew演算子は要らない?? のでしょうか?? またobjとobj2の2つの違いを色々試したのですが違いがわかりません。new演算子を 付けたインスタンスと付けないインスタンス??の違いをどなたか ご教授いただけると助かります。

  • javaのボタン表示等に関する質問

    下記のコードはフォームをNORTH、CENTER、SOUTHEに分割して、それぞれのpaneに ラベルとボタンを表示するものです。 Q1)myFrame.setBounds(350,0, total_x, total_y)をコンストラクターの最初に記述しますと  フォームの表示が正常でなく、コンストラクターの最後では、正常に行なわれます。  この理由等について、コメント頂けますと有り難いです。 Q2)mainに記述してある、下記のコードは無くても、Xでクロースできますが,このコード  の記述は正しいでしょうか GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 以上お手数ですが、コメント頂けますと大変助かります。 //============================================= import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; public class GridLayout_new extends JFrame{ int panelA_x=200, panelA_y=50; int panelB_x=200, panelB_y=200; int panelC_x=200, panelC_y=50; int total_x=panelA_x; int total_y=panelA_y+panelB_y+panelC_y; public static void main(String[] args){ GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } GridLayout_new(){ JFrame myFrame=new JFrame(); myFrame.setTitle("panelA"); // myFrame.setBounds(350,0, total_x, total_y); //正常なformの表示が出来ない myFrame.setVisible(true); LineBorder border = new LineBorder(Color.BLACK, 1, true); //======================== JLabel button1=new JLabel("Label1"); GLabel_Layout(button1, border); JButton button2 = new JButton("button2"); button_Layout(button2, border); //======================== JLabel button3=new JLabel("Label3"); GLabel_Layout(button3, border); JButton button4 = new JButton("button4"); button_Layout(button4, border); //======================== JLabel button5=new JLabel("Label5"); GLabel_Layout(button5, border); JButton button6 = new JButton("button6"); //======================== JLabel button7=new JLabel("Label7"); GLabel_Layout(button7, border); JButton button8 = new JButton("button8"); //======================== JLabel button9=new JLabel("Label9"); GLabel_Layout(button9, border); JButton button10 = new JButton("button10"); button_Layout(button10, border); //======================== JLabel button11=new JLabel("Label11"); GLabel_Layout(button11, border); JButton button12 = new JButton("button12"); button_Layout(button12, border); //================================== JPanel p1 = new JPanel(); GridLayout layout1 = new GridLayout(2,2); //2行、2列の設定 layout1.setHgap(2); layout1.setVgap(10); p1.setLayout(layout1); p1.setBackground(Color.GREEN); p1.add(button1); p1.add(button2); p1.add(button3); p1.add(button4); myFrame.setSize(panelA_x, panelA_y); myFrame.getContentPane().add(p1, BorderLayout.NORTH); //============================== JPanel p2 = new JPanel(); GridLayout layout2 = new GridLayout(2,2); //2行、2列の設定 layout2.setHgap(2); layout2.setVgap(10); p2.setLayout(layout2); p2.setBackground(Color.GREEN); p2.add(button5); p2.add(button6); p2.add(button7); p2.add(button8); myFrame.setSize(panelB_x, panelB_y); myFrame.getContentPane().add(p2, BorderLayout.CENTER); //================================== JPanel p3 = new JPanel(); GridLayout layout3 = new GridLayout(2,2); //2行、2列の設定 layout3.setHgap(2); layout3.setVgap(10); p3.setLayout(layout3); p3.setBackground(Color.GREEN); p3.add(button9); p3.add(button10); p3.add(button11); p3.add(button12); myFrame.setSize(panelC_x, panelC_y); myFrame.getContentPane().add(p3, BorderLayout.SOUTH); myFrame.setBounds(350,0, total_x, total_y); //正常なformの表示 } //constructor void GLabel_Layout(JLabel label, LineBorder border){ label.setPreferredSize(new Dimension(80,20)); label.setBorder(border); label.setBackground(Color.lightGray); label.setOpaque(true); } void button_Layout(JButton button, LineBorder border){ button.setPreferredSize(new Dimension(80,20)); button.setBorder(border); } } //main class....GridLayout_new

    • ベストアンサー
    • Java
  • JAVAの知識が乏しい超初心者です。

    JAVAの知識が乏しい超初心者です。 自分なりにコードを書いてみたのですが、うまくいきません。 お見せするのも恥ずかしいのですが 以下のように作ってみました。 import javax.swing.*; import java.awt.*; import javax.swing.border.TitledBorder; class FileKanri2 extends JFrame{  public static void main(String args[]){   FileKanri2 frame = new FileKanri2("テスト");   frame.setVisible(true);  }  FileKanri2(String title){   setTitle(title);   setBounds(100, 100, 830, 820);   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   setLayout(new FlowLayout());   JPanel p = pSakusei("題名",210);   bSakusei(p, "ボタン0", "補足0",0);   bSakusei(p, "ボタン1", "補足1",1);   bSakusei(p, "ボタン2", "補足2",2);   bSakusei(p, "ボタン3", "補足3",3);   bSakusei(p, "ボタン4", "補足4",4);   bSakusei(p, "ボタン5", "補足5",5);   bSakusei(p, "ボタン6", "補足6",6);   bSakusei(p, "ボタン7", "補足7",7);  }  public JPanel pSakusei(String pTitle, int tateSize){   JPanel p = new JPanel();   p.setBorder(BorderFactory.createTitledBorder(pTitle));   add(p, BorderLayout.NORTH);   p.setPreferredSize(new Dimension(810, tateSize));   p.setBackground(Color.white);   return p;  }  public void bSakusei(JPanel p, String bName, String lName, int i){   int btnSizeH = 50;   int btnSizeW = 180;   SpringLayout layout = new SpringLayout();   p.setLayout(layout);   JButton btn = new JButton(bName);   btn.setPreferredSize(new Dimension(btnSizeW, btnSizeH));   layout.putConstraint(SpringLayout.NORTH, btn,(i/4)*80+10, SpringLayout.NORTH,   p);   layout.putConstraint(SpringLayout.WEST, btn,(i%4)*200+10, SpringLayout.WEST,   p);   p.add(btn);   JLabel lbl = new JLabel(lName);   layout.putConstraint(SpringLayout.NORTH, lbl, 5, SpringLayout.SOUTH, btn);   layout.putConstraint(SpringLayout.WEST, lbl, 10, SpringLayout.WEST, btn);   p.add(lbl);   Container contentPane = getContentPane();   contentPane.add(p);  } } パネルの上にボタンを配置するだけなのですが、 添付の画像のように、ボタンが希望通りに並んでくれません; (ボタンの数を変えると、最初と最後のボタンだけ表示され  なおかつ最後のボタンのみ希望の位置に行ってくれます。) どこがおかしいのかご指摘お願いいたします。。

    • ベストアンサー
    • Java
  • JPanelの重ね方/OverlayLayout他

    添付した画像のような「ピラミッドのように大きいコンポーネントの上にだんだん小さなコンポーネントを重ねていく」のではないコンポーネントの重ね方がしたいです。そのようなことは可能なのでしょうか? やりたいこととしては、メインとなるパネルのその上で別のレイアウトをしたパネルを重ねたいです。 普通のレイアウトマネージャでaddで重ねるのでは、どうやってもうまくいきません。 OverlayLayoutも試してみましたが、以下の二つのパターンではうまくいきませんでした。 注:TopPanel,MainPanel,StringPanelはJPanelを継承した自作のクラスです 理想はMainPanel < StringPanel < TopPanelなのですが・・ JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); add(basePanel); この場合だと、MainPanel < TopPanel < StringPanelの関係になってしまいます JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); add(basePanel); こうするとTopPanelの描画が見えなかったのでおそらくTopPanel < MainPanel < StringPanelとなってます。 ご教示願います・・!

  • コンストラクタの引数の中のnew?

    はじめまして☆ java初心者ですが、意味がわからなくて困っています。 オブジェクトをnewする時、たまにコンストラクタの引数部分に newの記述がある時があるのですが、これはどういう意味でしょうか? (何のオブジェクトを作成しているのでしょうか?) よかったら、教えてください。

    • ベストアンサー
    • Java
  • コンストラクタと多重度

    class A { private B b1; private B b2[]; public A(B b){ if(b == null){ b1 = new B() } b1 = b; } public A(B[] ary){ if(ary == null || ary.length ! = 1){ b2 = new B(1) } b2 = ary; } } class B{} とあります。 AはBを参照し、多重度は1のものと、0又は1のものがあります。 NULLで判定しているのは、オブジェクトのデフォルト値でオブジェクトBの参照の代入をしているか判定しているのですか?  "ary.length ! = 1"は必ず必要なのでしょうか? インスタンス化の時にコンストラクタの実行がされるみたいですが、配列の場合、ゴミでも入るのでしょうか? インスタンス化する時以外でも、コンストラクタが実行されることがあるのですか? 多重度が「0又は1」と分かるように書かれているのでしょうか? 多重度が「0又は2」の場合はどう書きますか?

    • ベストアンサー
    • Java
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java
  • JAVAの正解・誤解判定の宣言が分かりません

    class ListPanel extends JPanel implements ActionListener{ JButton button1; JList list1; String[] data = {"( A )","( B )" ,"( C )" ,"( D )" }; ListPanel() { button1 = new JButton("選択OK"); button1.addActionListener(this); list1 = new JList(data); list1.setFixedCellWidth(100); JScrollPane scroll1 = new JScrollPane(list1); scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scroll1.setPreferredSize(new Dimension(150,80)); scroll1.setBorder(BorderFactory.createEtchedBorder() ); scroll1.setBorder(BorderFactory.createTitledBorder("選択肢") ); JPanel p1 = new JPanel(); p1.add(scroll1); JPanel p2 = new JPanel(); p2.add(button1); this.add(p1); this.add(p2); } public void actionPerformed(ActionEvent e1) { if (e1.getSource() == button1) { if (list1.getSelectedItem() == ( C ) ) { JOptionPane.showMessageDialog(null, "あなたが選択した解答" , " 正解です!",JOptionPane.INFORMATION_MESSAGE); } else if (list1.getSelectedItem() != ( C ) ){ JOptionPane.showMessageDialog(null, "あなたが選択した解答", "間違いです!解答は( C )です" , JOptionPane.INFORMATION_MESSAGE); list1.getSelectedItem() == ( C ) ) { の宣言が間違っているようです。何卒よろしくお願いいたします。どこが間違っているか指摘していただければ幸いです。どうか、よろしくお願いします。

  • コンストラクタの使い方?

    僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{   public B(String stitle){    super(stitle);  } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car {   private int num;   private double gas;   public Car()   {    System.out.println(車を作成しました。)   } } class C { ....main...   {    Car car1=new Car();   } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

    • ベストアンサー
    • Java
  • 【PHP】コンストラクタ―について

    コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();

    • ベストアンサー
    • PHP

専門家に質問してみよう