コンストラクタの種類について教えてください!!

このQ&Aのポイント
  • コンストラクタの種類にはデフォルトコンストラクタ、引数を持たないコンストラクタ、引数を持つコンストラクタがあります。
  • LinearLayout ll = new LinearLayout(this)の部分では引数ありのコンストラクタが呼ばれますが、LinearLayout ll = new LinearLayout()のときは引数なしのコンストラクタが呼ばれます。
  • デフォルトコンストラクタが呼ばれるときの記述式はコンストラクタ名の後ろに()を付ける形式です。
回答を見る
  • ベストアンサー

コンストラクタの種類について教えてください!!

コンストラクタの種類について教えてください!! LinearLayout ll = new LinearLayout(this)の部分について質問いたします 自分はコンストラクタの種類についてデフォルトコンストラクタと引数を持たないコンストラクタと引数を持つコンストラクタがあると認識しています。LinearLayout ll = new LinearLayout(this)の部分では引数ありのコンストラクタが呼ばれるのはわかります。そこでLinearLayout ll = new LinearLayout()のときは引数なしのコンストラクタが呼ばれますよね?ではデフォルトコンストラクタが呼ばれるときの記述式はどのような文になるのでしょうか?教えてください!!!お願いいたします!!

  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

>>このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 > →この場合はJava側が用意するデフォルトコンストラクタが呼ばれるためコンパイルは成功するのでは? 残念ながらそうなりません。 たとえば、 class B {  public B(int i) {}  // public B() がない }   …… B b = new B(); というコードはエラーになります。 この場合、プログラマは引数のないコンストラクタを書いていませんが、コンストラクタ自体は書いているため、Java はデフォルトコンストラクタを用意しません。したがって、引数がないコンストラクタをプログラマと Java との両方とも定義していないため B を引数なしで生成することはできません。 > つまりA a = new A();において呼ばれるコンストラクタはプログラム側が引数なしのコンストラクタを定義していた場合はそれが呼ばれ、定義していない場合はJava側が用意するデフォルトコンストラクタが呼ばれると理解してよろしいでしょうか? 上記の文は、「定義していない場合は」の前に「引数付きのものを含めてプログラム側が一切のコンストラクタを」が入ると正しくなります。引数なしのコンストラクタは書いていないが引数付きのものは書いている場合は最初に書いた通りです。

tomotomo2012
質問者

お礼

理解できました!!こんな夜おそくまでお付き合いありがとうございました!!

その他の回答 (2)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

#1. の回答者ですが、その補足について。 > Aクラスに引数のないコンストラクトがありますと、そのコンストラクトが呼ばれ、Aクラスにコンストラクトが存在しないとデフォルトコンストラクトが呼ばれるのでしょうか? この部分はそのとおりです(語句が間違ってますが)。 しかし、 > つまりA a = new A();の式でもAクラスのコンストラクタが存在するかしないかで2通りの呼び方があるということでいいのでしょうか? の部分は勘違いしています。 A a = new A(); と書いたとき、呼ばれるのはあくまでも引数のないコンストラクタです。 プログラマが何らかのコンストラクタを書いたならばそのうちで引数のないコンストラクタが呼ばれます。このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 プログラマがコンストラクタを一切書かなかった場合は Java が引数のないコンストラクタを用意してそれを呼びます。 この Java が用意した引数のないコンストラクタのことをデフォルトコンストラクタと呼んでいるだけで、インスタンス生成するときにはそのとき使用するコンストラクタがデフォルトかプログラマが書いたものかの区別はありません。

tomotomo2012
質問者

補足

回答ありがとうございます!! 気になる部分があるのですが このときプログラマが引数のないコンストラクタを書かなかったならば、上記の構文は引数のない場合の A インスタンス生成方法がないためコンパイルエラーとなります。 →この場合はJava側が用意するデフォルトコンストラクタが呼ばれるためコンパイルは成功するのでは? つまりA a = new A();において呼ばれるコンストラクタはプログラム側が引数なしのコンストラクタを定義していた場合はそれが呼ばれ、定義していない場合はJava側が用意するデフォルトコンストラクタが呼ばれると理解してよろしいでしょうか? また回答をいただけるとありがたいです!

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

A a = new A(); ただし、Aにコンストラクタを一切記述していないとき。

参考URL:
http://www.javadrive.jp/start/constructor/index4.html
tomotomo2012
質問者

補足

すみません A a = new A(); を例にとりますと Aクラスに引数のないコンストラクトがありますと、そのコンストラクトが呼ばれ、Aクラスにコンストラクトが存在しないとデフォルトコンストラクトが呼ばれるのでしょうか?つまりA a = new A();の式でもAクラスのコンストラクタが存在するかしないかで2通りの呼び方があるということでいいのでしょうか?

関連するQ&A

  • コンストラクタについて教えてください!!

    すみません A a = new A(); を例にとりますと Aクラスに引数のないコンストラクトがありますと、そのコンストラクトが呼ばれ、Aクラスにコンストラクトが存在しないとデフォルトコンストラクトが呼ばれるのでしょうか?つまりA a = new A();の式でもAクラスのコンストラクタが存在するかしないかで2通りの呼び方があるということでいいのでしょうか?

    • ベストアンサー
    • Java
  • コンストラクタの引数の中のnew?

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

    • ベストアンサー
    • Java
  • 以下のサンプルでのthisが指すものについて・・・

    package ya.Sample; import android.app.*; import android.os.*; import android.widget.*; public class Sample2 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); setContentView(ll); TextView tv = new TextView(this); tv.setText("ようこそアンドロイドへ!"); ll.addView(tv); } } このサンプルにおいてLinearLayout ll = new LinearLayout(this)のthisの指すものについて質問があります。私がこのthisはSample2を指すんですよねと質問したところ 引数thisは Sample2 を指しますよね 大雑把な理解だなぁ。 Sample2は「型」なのだから、例えば「整数」や「文字列」のような概念だ。 thisは特定のインスタンスを指すのだから、1024とか"abc"とか、そのクラスに属するもののうち、特定の具象を指すものだ。 27や47が整数である、というのと同じ意味で、thisはSample2ではあるのだが、こういう場合は普通「thisはSample2のインスタンスである」と表現する とある方に回答をいただいたのですが 「thisはSample2のインスタンスである」と表現する の部分のインスタンスが理解できません・・・ インスタンスとはClassから製造されたObjectであるはずですからこの場合 Sample2クラスを雛型として作られたObjectをThisは指すとかってに再解釈してしまい、 この引数Thisはオブジェクトのことでありnew LinearLayout(this)において、LinearLayoutは引数にオブジェクトを持っているということでしょうか?そして継承関係よりこのオブジェクトはContextクラス(?)も含んでいるため、LinearLayoutクラスのLinearLayout(Context context)は呼び出しに成功するということなのでしょうか? 今までJavaの引数で見てきたのが実数や文字だったので、引数がオブジェクト(?)なのにちょっと違和感がありまして・・・ 回答していただけたらうれしいですよろしくお願いいたします!!!

    • ベストアンサー
    • 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
  • コンストラクタの記述について ―引数を持ったクラスを継承する場合―

    コンストラクタの記述について ―引数を持ったクラスを継承する場合― ActionScript3.0でプログラミングをしています。 クラスの継承に挑戦したのですが、うまくいきません。 コンストラクタの記述は、何か特別なものが必要なのでしょうか? ■コンストラクタに引数なし → 成功。 ■コンストラクタに引数あり → 失敗。  エラー「No default constructor found in base class <親クラスの名前>」。 ■エラーの出るソース↓ ・Main.as(コンストラクタ内抜粋)     var parent:Parent = new Parent(100);     var child:Child = new Child(200); ・Parent.as package {   import flash.display.Sprite;      public class Parent extends Sprite {     protected var str:String = "親クラスのプロパティ";     public function Parent(inNum:Number):void {       trace("親クラス, ", str, inNum);     }   } } ・Child.as package {   import Parent;   public class Child extends Parent {     public function Child(inNum:Number):void { //■エラー。       trace("子クラス, ", str, inNum);     }   } } ご存知の方、よろしくお願いします。 よろしくお願いします!

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

    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オブジェクトを引数にもつ事は理解できますが、コンストラクターの部分はいまいち理解できません。初歩的な質問ですが、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • オブジェクトをデフォルトコンストラクタでnewする際の()の指定について

    オブジェクトをnewしてデフォルトコンストラクタを 呼び出す際の記述には以下の二通りがあると思いますが、 どちらの方を選択すべきでしょうか? 単なるスタイルの問題なのでしょうか? それとも厳密には挙動が違ったりするのでしょうか? ClassA* a = new ClassA; ClassA* a = new ClassA();

  • コンストラクタでvar ?

    javascriptのコンストラクタについて。 下記のコードで、変数を2つ宣言しています(★)が、 下部のfor文で、その変数名を引数のstr,numにすれば、★での宣言は不要ですか? 宣言しとくと何かメリットがあるのでしょうか? var Repeater = function(str, num){ var string = str, //★ number = num;     //★ this.repeat = function (){ var i, result = ""; for(i = 0; i < number; i++ ) { result += string; } return result; }; }; new Repeater("abc", 3).repeat(); あるサイトから引用

  • デフォルトコンストラクタで分からないことがあります。

    デフォルトコンストラクタ デフォルトコンストラクタで分からないことがあります。 以下のコードです。 > template<class T1, class T2> > struct pair > { > T1 first; // 1つ目の値 > T2 second; // 2つ目の値 > > // デフォルトコンストラクタ > pair() : first( T1() ), second( T2() ){} > > // 引数付きコンストラクタ > pair(const T1& a, const T2& b) : first( a ), second( b ){} > }; このコードの中の pair() : first( T1() ), second( T2() ){} で初期化子による初期化をしていると思うのですが「T1()」と「T2()」は具体的に 何をしているのでしょうか?自分の想像ではfirstとsecondに何か初期化の値を代入して初期化していると思うのですが何でしょうか? なお、その次のコードの意味は分かります。 > pair(const T1& a, const T2& b) : first( a ), second( b ){} これは、引数a,bを持っていてそれぞれfirstにaを代入してsecondにbを代入して初期化しているのですよね。 なお、このコードが掲載されているサイトはここです。 http://www.geocities.jp/ky_webid/cpp/library/011.html