• ベストアンサー

コンストラクタとその類似の形について 初心者です。

zgmfx10aの回答

  • zgmfx10a
  • ベストアンサー率9% (1/11)
回答No.1

まずは、専門用語の説明です。知ってたら蛇足ですね。 ・プログラム1のBook はコンストラクタです ・プログラム2のsetData はメソッドです ・メンバ:上記の price、num、name、placeという  クラスの中の変数のこと ということで、コンストラクタとメソッドの違いを説明します。 コンストラクタは、クラスの初期化時に呼ばれる関数です。 メソッドはプログラム上で実行しないと呼ばれません。 ・プログラム1 の使用例 // 作成 b = new Book( "本", 100 );  → b.price等のメンバは利用できます ・プログラム2 の使用例 // 作成 c = new Cat();  → c.name等のメンバは利用できません(エラーになるはず) // データをセット c.setData( "猫", "どこか", 1 );  → c.name等のメンバ利用可能になります

1minarai
質問者

補足

早速のご返信ありがとうございます。 もしよろしければ、補足説明お願いします。 ・プログラム1 の使用例 // 作成 b = new Book( "本", 100 );  → b.price等のメンバは利用できます。 これはコンストラクタで、変数t,pを初期化しているので、数値を代入して使えるということですか? ・プログラム2 の使用例 // 作成 c = new Cat();  → c.name等のメンバは利用できません(エラーになるはず) これはメソッドとして定義しているだけ(?)なので、変数n,p,aを使うためにはnewしてから、setdataする必要があるということですか?  結局、コンストラクタとメソッドの違いはその後の使い方が違うということなのでしょうか? 教えていただけると大変ありがたいです。

関連するQ&A

  • コンポジション コンストラクタに引数がある場合

    class Person{ public String name_; public int age_; public Person(String n,int a){ name_ = n; age_ = a; } } class Student{ public Person person_; public int grade_; public Student(Person p,int g){ person_ = new Person("MOTO",2); grade_ = g; } } public class Samconp2{ public static void main(String[] args){ Student asaya_ = new Student(p,0); } System.out.println(asaya_.person_.name+asaya_.person_.age_+asaya_.grade__); } 3のプログラムを見るようにコンストラクタに引数使い、又継承を使わないでPerson クラスのname_ age_ それを拡張したStudetクラスのgrade_をmain関数で表したいのですが(希望としてはname_ "Moto" age_ 2 grade_ 0) 結果としては、System.out.println(asaya_.personn_.name_ + asaya_.person_.age_ +asaya_grade_);で<identifierがありません>となります。 まだ初心者で良く分りません。解決方法をお願いします。

    • ベストアンサー
    • Java
  • 初心者なのですが・・・

    Bookクラスに出版年(西暦)を保持するフィールド(int型)を追加し、そのフィールドにアクセスするためのメソッドvoid setYear(int year)とint getYear()を作成して、main関数の中でインスタンスmyBookに対して出版年の設定と出力を行うようにする。また、題名、価格、出版年を一度に設定してインスタンスを生成するためのコンストラクタにしたいのですが、よくわかりません。どなたか教えてもらえないでしょうか? 下記は作成中のプログラムです。 public class javaprog { public static void main(String[] args) { /* Bookクラスからインスタンスを生成 */ Book myBook = new Book("The Java Tutorial", 55); System.out.println("My book title = " + myBook.getTitle()); System.out.println("My book title = " + myBook.title); System.out.println("My book price = $" + myBook.getPrice()); System.out.println("My book year = " + myBook.getYear()); /* Bookクラスからインスタンスを生成 */ Book yourBook = new Book("The Java Programming Language", 40); System.out.println("Your book title = " + yourBook.getTitle()); System.out.println("Your book price = $" + yourBook.getPrice()); } } class Book { // クラスBookの宣言 String title; // 題名 private int price; // 価格(ドル) int year; // 出版年(西暦) Book(String t, int p, int y) { // コンストラクタ title = t; // 題名の設定 price = p; // 価格の設定 } public String getTitle() { // 題名の取得 return title; } public int getPrice() { // 価格の取得 return price; } public void setYear(int year) { // 出版年の設定 } public int getYear() { // 出版年の取得 return year; } }

    • ベストアンサー
    • Java
  • 実引数リストと仮引数リストの長さが異なります

    実引数と仮引数はあっているはずですが、次のエラーが出ます。どうしてでしょうか? ------エラー----------------------- java: クラス Itemのコンストラクタ Itemは指定された型に適用できません。 期待値: 引数がありません 検出値: java.lang.String,int,java.util.Date 理由: 実引数リストと仮引数リストの長さが異なります -------------------------------------------------- public class Main { public static void main(String[] args) { String name= "test"; int price = 0; Date date = new Date(); Item item = new Item(name,price,date);//コンストラクタ実引数 } } class Item{ String name; int price; Date date; void Item(String name, int price, Date date)//コンストラクタ仮引数 { this.name = name; this.price = price; this.date = date; } }

    • ベストアンサー
    • Java
  • 初心者なのですが、

    OnlineBookクラスを継承したOnlineMagazineクラスを作成して、出版月と出版日を保持するフィールド(int型)を追加する。これらに登録を行うメソッドvoid setMonth(int month),void setDate(int date)、および出版年/出版月/出版日をまとめて出力するメソッドString getPublicationDate()を作成する。といったことをやったのですがエラーが出てどうすればよいのかわかりません。どなたか教えてもらえないでしょうか? public class javaprog { public static void main(String[] args) { /* Bookクラスからインスタンスを生成 */ Book book = new Book("The Java Tutorial", 55, 1999); System.out.println("Title = " + book.getTitle()); System.out.println("Price = " + book.getPrice()); /* Bookクラスからインスタンスを生成 */ OnlineBook obook = new OnlineBook("The Java Virtual Machine Specification", 0, "http://java.sun.com/docs/books/vmspec/index.html"); System.out.println("Title = " + obook.getTitle()); System.out.println("Price = " + obook.getPrice()); System.out.println("Website = " + obook.getWebsite()); System.out.println(getPublicationDate()); } } class Book { // クラスBookの宣言 String title; // 題名 private int price; // 価格(ドル) int year; // 出版年(西暦) Book(String t, int p, int y) { // コンストラクタ title = t; // 題名の設定 price = p; // 価格の設定 year = y; // 出版年の設定 } public String getTitle() { // 題名の取得 return title; } public int getPrice() { // 価格の取得 return price; } public int getYear() { // 出版年の取得 return year; } } class OnlineBook extends Book { // クラスBookを継承 public String website; // URL OnlineBook(String t, int p, int y, String website) { super(t, p, y); // スーパークラスのコンストラクタの呼び出し this.website = website; // URLの設定 } public String getWebsite() { // URLの取得 return website; } public String getTitle() { return "Online: " + title; } } // 追加したところ↓ class OnlineMagazine extends OnlineBook { // クラスOnlineBookを継承 int month; // 出版月 int date; // 出版日 OnlineMagazine(String t, int p, int y, String website) { super(t, p, y, website); setMonth(5); setDate(27); } void setMonth(int month) { // 出版月を設定するメソッド this.month = month; } void setDate(int date) { // 出版日を設定するメソッド this.date = date; } String getPublicationDate() { // 出版年/出版月/出版日をまとめて出力するメソッド return "出版年/出版月/出版日" + year/ + month/ + date; } } エラー↓ % javac javaprog.java javaprog.java:9: シンボルを解決できません。 シンボル: コンストラクタ OnlineBook (java.lang.String,int,java.lang.String) 場所 : OnlineBook の クラス OnlineBook obook = new OnlineBook("The Java Virtual Machine Specification", 0, "http://java.sun.com/docs/books/vmspec/index.html"); ^ javaprog.java:14: シンボルを解決できません。 シンボル: メソッド getPublicationDate () 場所 : javaprog の クラス System.out.println(getPublicationDate()); ^ エラー 2 個 %

    • ベストアンサー
    • Java
  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • クラス名を変えるとコンパイルが通らない

    interface HINA { void write(String str, int age); } class super_class { String name; int age; public void write(String str, int age){ System.out.println(str + "\t" + age); } super_class(String name, int age) { this.name = name; this.age = age; } } class sub_class extends super_class implements HINA { public void write(String str , int age) { System.out.println(str + "\t" + age); } sub_class(String str , int age) { super(str , age); } } public class test3 { public static void main(String[] args) { super_class naru = new super_class("成瀬川なる", 17); super_class shinobu = new sub_class("前原しのぶ", 13); sub_class motoko = new sub_class("青山素子", 15); if (naru instanceof HINA) naru.write(naru.name, naru.age); if (shinobu instanceof HINA) shinobu.write(shinobu.name, shinobu.age); if (motoko instanceof HINA) motoko.write(motoko.name, motoko.age); } } これのsuper_classをOyaに、sub_classをKoにするとコンパイルエラーになります。 何故なんでしょう。 分かる方がいましたら、教えて下さい。 どうぞ宜しくお願い致します。 それと見づらくてどうもすいません。

    • ベストアンサー
    • Java
  • コンストラクタで設定した値が表示されない

    以下のプログラムを見ていただけたら分かるとおり、コンストラクタで設定した値が、配列だと表示されるのに、配列を使用していない変数だと表示されません。なせなのでしょうか? よろしくお願いします。 package test; public class test { public test(int[] idt, double ddt, String title) { title = "テスト"; ddt = 99.9; for(int i=0; i<idt.length; i++) { idt[i] = i; } } public static void main(String[] args) { int[] idt = {0, 0, 0}; double ddt=0.0; String title= ""; test t = new test(idt, ddt, title); for(int i=0; i<idt.length; i++) { System.out.println(idt[i]); } System.out.println(ddt + ", " + title); } }

    • ベストアンサー
    • Java
  • コンストラクタ

    恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{    Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?

    • ベストアンサー
    • Java
  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java
  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } }