質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

602閲覧

Java 引数あり、なしそれぞれのコンストラクタを用いて検索する結果を出力したい

36549

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2024/07/29 02:36

編集2024/07/29 06:01

0

0

実現したいこと

引数なしコンストラクタ
タイトル、いちばんやさしい基本情報技術者
著者名、高橋京介
価格、1980円

引数なしコンストラクタ
タイトル、2024応用情報技術者午後問題の重点対策
著者名、小口達夫
価格、3740円

このように引数の有無それぞれのコンストラクタを用いて検索する結果を出力したいです。

発生している問題・分からないこと

引数なしコンストラクタ
いちばんやさしい基本情報技術者高橋京介1980
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
トークン "void" に構文エラーがあります。正しくは record です
変数 setTitle に void は無効な型です
トークン "{" に構文エラーがあります。このトークンの後には { を指定する必要があります
トークン "{" に構文エラーがあります。このトークンの後には { を指定する必要があります
構文エラーがあります。"}" を挿入して ClassBody を完了してください
構文エラーがあります。";" を挿入して RecordBodyDeclaration を完了してください
構文エラーがあります。"}" を挿入して RecordBody を完了してください

at study.Main.main(Main.java:25)

実行したところエラーとなりました。主に下記のプログラムについてエラーが出てしまいます。

25 public void setTitle(String title) {
26 this.TITLE_1 = title;
27 }

トークン "void" に構文エラーがあります。正しくは record です
変数 setTitle に void は無効な型です
トークン "{" に構文エラーがあります。このトークンの後には { を指定する必要があります
トークン "{" に構文エラーがあります。このトークンの後には { を指定する必要があります
こちらのエラーですがsetTitleがエラーでsetAuthor、setPricesが何故問題なく通るのか解決できずにおります。
括弧やセミコロンはctrl+fで検索しヒットしたため誤字ではないと思いますが、構文エラーの解決方法が分かりかねるため、併せてご回答、ご助力いただけますと幸いです。

該当のソースコード

Main.java

1public class Main { 2 3 //Bookデータ1 4 public static final String TITLE_1 = "いちばんやさしい基本情報技術者"; 5 public static final String AUTHOR_1 = "高橋京介"; 6 public static final int PRICE_1 = 1980; 7 8 //Bookデータ2 9 public static final String TITLE_2 = "2024応用情報技術者午後問題の重点対策"; 10 public static final String AUTHOR_2 = "小口達夫"; 11 public static final int PRICE_2 = 3740; 12 13 public static void main(String[] args) { 14 15 // 変数名をBook1でBookクラスをインスタンス化して引数なしのコンストラクタを呼びだす 16 Book Book1 = new Book(); 17 Book1.setTitle(TITLE_1); 18 Book1.setAuthor(AUTHOR_1); 19 Book1.setPrices(PRICES_1); 20 21 22 23 //セッターメソッドをそれぞれ呼び出しBookクラスにBookデータ1のデータを格納 24 25 public void setTitle(String title) { 26 this.TITLE_1 = title; 27 } 28 public void setAuthor(String author) { 29 this.AUTHOR_1 = author; 30 } 31 public void setPrices(int prices) { 32 this.PRICE_1 = prices; 33 } 34 35 36 // 本の紹介を出力 37 Book1 intoroduce(); 38 39 40 41 /* 変数名をBook2でBookクラスをインスタンス化し 42 引数ありのコンストラクタを呼び出しBookデータ2をBookクラスに格納 43 */ 44 Book Book2 = new Book(TITLE_2,AUTHOR_2,PAGES_2) { 45 this.TITLE_2 = TITLE_2; 46 this.AUTHOR_2 = AUTHOR_2; 47 this.PRICE_2 = PRICE_2; 48 } 49 50 51 52 // 本の紹介を出力 53 Book2 intoroduce(); 54 55 56 57 } 58 59 60

Book.java

1public class Book { 2 3 //フィールド変数 4 private String title; 5 6 private String author; 7 8 private int prices; 9 10 //「引数なしコンストラクタ」を出力 11 public Book() { 12 System.out.println("引数なしコンストラクタ"); 13 } 14 15 16 //「引数ありコンストラクタ」を出力 17 //タイトル、著者、ページ数のデータを受け取り、それぞれBookクラスのフィールド変数に格納 18 public Book(String title, String author, int prices) { 19 System.out.println("引数ありコンストラクタ"); 20 } 21 22 //getterメソッド、setterメソッド 23 public String getTitle() { 24 return title; 25 } 26 27 public void setTitle(String title) { 28 this.title = title; 29 } 30 31 public String getAuthor() { 32 return author; 33 } 34 35 public void setAuthor(String author) { 36 this.author = author; 37 } 38 39 public int getPrices() { 40 return prices; 41 } 42 43 public void setPrices(int prices) { 44 this.prices = prices; 45 } 46 47 //本の紹介をするメソッド 48 //アクセス修飾子:public 49 //返り値:なし 50 //メソッド名:intoroduce 51 //引数:なし 52 public void intoroduce() { 53 System.out.println("タイトル、" + title); 54 System.out.println("著者名、" + author); 55 System.out.println("価格、" + prices + "円"); 56 57 } 58 59 60 61} 62

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

様々な単語を検索し解決したいと思いましたが糸口を見つけられず手詰まりになり質問させていただきます。
ご助力いただけたらと思います、何卒宜しくお願い致します。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2024/07/29 12:04 編集

「発生している問題・分からないこと」の内容がどうなっているのかよく分からないんですが・・・ 何かを行って画面に表示されたメッセージは、纏まり毎にコードのマークダウンと同じ ``` で前後を囲ってください。 >様々な単語を検索し解決したいと思いましたが糸口を見つけられず 大抵は、ネットの情報は「ついに分かった人」が分かったことを書きます。ですから「分かった人」が分かったことをどう書くかの想像が付かないと単語が一致しません。 ですが当然「まだ分かってない人」には分からないですから、検索してどうにかするのは難しいです。 このようなことは、間接的なネットでは無く直接的に"一緒に画面を見ながら質問したり回答を得られたりする"ような友人知人等に聞いた方が良いです。もしそのような環境が無いということなら、なんとか作るのがまず先かと思います。
guest

回答2

0

Javaプログラムは main メソッドの先頭から実行が始まり、main メソッドの末尾に到達するとプログラムが終了します。質問文のコードでは

  1. 引数なしで Book のインスタンス化
  2. そのインスタンスのフィールドの設定
  3. そのフィールドの表示
    mainメソッドが終了しています。質問文の mainメソッドの下に書いてあるコードは実行されません。
    (というか、現状のコードはコンパイルできないんじゃないかと)
  • 引数ありのコンストラクタの使用は、Book book2 = new Book(引数, ...); のようになります。
  • 問題の意図としては、System.out.print(...) で値を表示するのではなく、Book1.introduce(); を使うのだと思います。

投稿2024/07/29 02:55

編集2024/07/29 03:02
int32_t

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

36549

2024/07/29 06:04

ご回答頂き誠にありがとうございます。 mainメソッドをセッターメソッド前に「}」で閉じたのが原因ということでしょうか? ご助言を元に書き換え質問を更新しました。宜しくお願い致します。
int32_t

2024/07/29 06:13

更新されたコードへのコメント * mainメソッド内でメソッドを定義することはできませんし、そもそもセッターメソッドは不要です。消しましょう。 * Bookクラスのメソッドを呼び出すには、Book1.introduce() のように「インスタンス ピリオド メソッド名」の順で書きます。 * コンストラクタの呼び出しに {} は不要です。消しましょう。
jimbe

2024/07/29 11:18

Book の引数有りコンストラクタで受け取った引数の値をフィールドに設定してませんね。
guest

0

ベストアンサー

あちこち違うので一つずつ指摘しても纏まら無さそうですので、まず(想像上の)全体の形を出しておきます。
大きい変更は、引数ありのコンストラクタ、"価格"は PRICES では無く PRICE 、変数名は小文字始まり、 new の処理の説明コメント、インデントはスペースで、です。
特に引数ありのコンストラクタは受け取った引数で各セッターと同じことを行うのが通常で、つまり(book1のように) "引数なしのコンストラクタ呼んでから各セッターを呼んで値を設定する" という面塔なことしなくて済んで楽だね…というのが本件の注目点かもしれません。

Main.java

java

1public class Main { 2 //Bookデータ1 3 public static final String TITLE_1 = "いちばんやさしい基本情報技術者"; 4 public static final String AUTHOR_1 = "高橋京介"; 5 public static final int PRICE_1 = 1980; 6 //Bookデータ2 7 public static final String TITLE_2 = "2024応用情報技術者午後問題の重点対策"; 8 public static final String AUTHOR_2 = "小口達夫"; 9 public static final int PRICE_2 = 3740; 10 11 public static void main(String[] args) { 12 // 変数名をbook1とし、Bookクラスの引数なしのコンストラクタを呼びだしてインスタンス化 13 Book book1 = new Book(); 14 //セッターメソッドをそれぞれ呼び出しbook1(のオブジェクト)にBookデータ1のデータを設定 15 book1.setTitle(TITLE_1); 16 book1.setAuthor(AUTHOR_1); 17 book1.setPrice(PRICE_1); 18 // 本の紹介を出力 19 book1.introduce(); 20 21 // 変数名をbook2とし、Bookクラスの引数ありのコンストラクタを呼び出して(Bookデータ2を設定して)インスタンス化 22 Book book2 = new Book(TITLE_2, AUTHOR_2, PRICE_2); 23 // 本の紹介を出力 24 book2.introduce(); 25 } 26}

Book.java

java

1public class Book { 2 //フィールド変数 3 private String title; 4 private String author; 5 private int price; 6 7 //「引数なしコンストラクタ」を出力 8 public Book() { 9 System.out.println("引数なしコンストラクタ"); 10 } 11 12 //「引数ありコンストラクタ」を出力 13 //タイトル、著者、価格のデータを受け取り、それぞれBookクラスのフィールド変数に格納 14 public Book(String title, String author, int price) { 15 System.out.println("引数ありコンストラクタ"); 16 this.title = title; 17 this.author = author; 18 this.price = price; 19 } 20 21 //getterメソッド、setterメソッド 22 public String getTitle() { 23 return title; 24 } 25 26 public void setTitle(String title) { 27 this.title = title; 28 } 29 30 public String getAuthor() { 31 return author; 32 } 33 34 public void setAuthor(String author) { 35 this.author = author; 36 } 37 38 public int getPrice() { 39 return price; 40 } 41 42 public void setPrice(int price) { 43 this.price = price; 44 } 45 46 //本の紹介をするメソッド 47 //アクセス修飾子:public 48 //返り値:なし 49 //メソッド名:introduce 50 //引数:なし 51 public void introduce() { 52 System.out.println("タイトル、" + title); 53 System.out.println("著者名、" + author); 54 System.out.println("価格、" + price + "円"); 55 } 56}

実行結果( paiza.io )

引数なしコンストラクタ タイトル、いちばんやさしい基本情報技術者 著者名、高橋京介 価格、1980円 引数ありコンストラクタ タイトル、2024応用情報技術者午後問題の重点対策 著者名、小口達夫 価格、3740円

投稿2024/07/29 11:48

編集2024/07/29 12:10
jimbe

総合スコア13382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

36549

2024/07/30 00:11

ご回答頂き誠にありがとうございます。 試したところ問題が解決しました。 引数ありだとセッターを受け取った引数で設定する所まで認識していたのですが 各セッターを呼んで値を設定する必要が無いところまで理解が及んでいませんでした。 その他様々なご助言ありがとうございます。纏めてのコメント失礼致します。
jimbe

2024/07/30 01:14

様々なエラーが出た主な原因は、コンストラクタやメソッドの"定義の書き方"と"使用の書き方"の違いの認識と、仰るように何処で何をしなければならないかの認識の不足でしょうね。 前者は文法的な間違いですので正解が決まっていて分かってしまえば今後間違いは無くなっていくと思いますが、後者は仕様的な部分ですので今回の問題でこうだったから次回もその次もずっとこう…とは限らないですので、ご注意を。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問