質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

3回答

1199閲覧

Java エラー:引数リストの長さが異なります

riru5510

総合スコア1

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

0クリップ

投稿2021/05/18 06:50

前提・実現したいこと

入力された日付に対して年号を返すコードを書いたのですが、引数の受け渡しがうまくいかず以下のエラーが出てしまいます。実引数も仮引数も3つにしているつもりなのですが、どこを直したらいいでしょうか?
(学校の課題で継承・インスタンス・オーバーロード等を使うという条件があります)

発生している問題・エラーメッセージ

./FunctionSet02.java:7: エラー: クラス FunctionSet01のコンストラクタ FunctionSet01は指定された型に適用できません。 FunctionSet02(int y, int m, int d){ ^ 期待値: int 検出値: 引数がありません 理由: 実引数リストと仮引数リストの長さが異なります

該当のソースコード

Java

1import java.util.Scanner; 2 3class Main_wareki{ 4 public static void main(String [] args){ 5 int[] array = new int[3]; 6 String gengo; 7 8 Scanner sc = new Scanner(System.in); 9 System.out.println("生年月日を入力してください"); 10 System.out.println("yyyy = "); 11 array[0] = sc.nextInt(); 12 System.out.println("mm = "); 13 array[1] = sc.nextInt(); 14 System.out.println("dd = "); 15 array[2] = sc.nextInt(); 16 17 if(array[0]==1926){ 18 FunctionSet02 fs2 = new FunctionSet02(array[0], array[1], array[2]); 19 if(array[1]==12){ 20 gengo = fs2.f(25,"大正","昭和"); 21 }else{ 22 gengo = fs2.f(); 23 } 24 }else if(array[0]==1989){ 25 FunctionSet02 fs2 = new FunctionSet02(array[0], array[1], array[2]); 26 if(array[1]==1){ 27 gengo = fs2.f(7,"昭和","平成"); 28 }else{ 29 gengo = fs2.f(); 30 } 31 }else if(array[0]==2019){ 32 FunctionSet02 fs2 = new FunctionSet02(array[0], array[1], array[2]); 33 gengo = fs2.f(); 34 }else{ 35 FunctionSet01 fs1 = new FunctionSet01(array[0]); 36 gengo = fs1.f(); 37 } 38 39 System.out.println("あなたは"+ gengo +"生まれです"); 40 } 41} 42 43class FunctionSet01{ 44 int year; 45 46 FunctionSet01(int y){ 47 this.year = y; 48 } 49 50 String f(){ 51 if(year<1926){ 52 return "大正"; 53 }else if(year<1989){ 54 return "昭和"; 55 }else if(year<2019){ 56 return "平成"; 57 }else{ 58 return "令和"; 59 } 60 } 61} 62 63class FunctionSet02 extends FunctionSet01{ 64 int month; 65 int day; 66 67 FunctionSet02(int y, int m, int d){ 68 this.year = y; 69 this.month = m; 70 this.day = d; 71 } 72 73 String f(){ 74 if(year==1926){ 75 return "大正"; 76 }else if(year==1989||(year==2019&&month<=4)){ 77 return "平成"; 78 }else{ 79 return "令和"; 80 } 81 } 82 String f(int last, String gengo1, String gengo2){ 83 if(day<=last){ 84 return gengo1; 85 }else{ 86 return gengo2; 87 } 88 } 89}

試したこと

メインメソッドのFunctionSet02に関係する部分をコメントアウトした時は実行できました。

補足情報(FW/ツールのバージョンなど)

macのターミナルで実行しています。

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

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

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

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

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

dodox86

2021/05/18 07:09

> メインメソッドのFunctionSet02 メソッドで書くべき部分と、クラスのコンストラクタで書くべき部分を混同しているということはありませんか? コンストラクタで年月日の3つをセットするのでしょうか。課題の本当の主旨が分かりませんが、 String nengo = obj.FunctionSet02(年, 月, 日); みたいな呼び出しで年号を取得することを求めているのではないですか?
dodox86

2021/05/18 07:11

まぁ、"FunctionSetNN"だとクラス名っぽくもありますが。各種関数(メソッド)のセットを収めたクラス、みたいな? (課題自体がちょっと謎)
guest

回答3

0

継承をする場合、必ず親クラスのコンストラタを実行しなければなりません。
独自のコンストラクタを何も定義していなければ、内部で自動で作られたデフォルトコンストラクタ(引数なしコンストラクタ)が呼ばれるため意識することはありませんが、今回は独自のコンストラクタを定義しているため、明示的に親のコンストラクタを呼ぶ必要があります。

つまりFunctionSet02(int y, int m, int d)から親のコンストラクタを呼ばなければならないということです。

提示されたコードを見る限り、方法としては2つ考えられます。

1.FunctionSet02から、FunctionSet01のコンストラクタを呼ぶ

Java

1FunctionSet02(int y, int m, int d) { 2 super(y); 3 this.month = m; 4 this.day = d; 5}

インスタンス変数のyはFunctionSet01にあり、yを初期化するコンストラクタもFunctionSet01にあるので、このようにするのがベストでしょう。

2.FunctionSet01にデフォルトコンストラクタを定義する

Java

1class FunctionSet01 { 2 int year; 3 4 // これを追記する 5 public FunctionSet01() { 6 } 7 8 FunctionSet01(int y) { 9 this.year = y; 10 } 11 12 // 以下省略 13}

このようにすることでFunctionSet02(int y, int m, int d)から、暗黙でデフォルトコンストラクタが呼ばれるためコンパイルは通ります。
しかし、このコンストラクタを用意することでyに値が設定されていない状態でFunctionSet01のインスタンスを作成できてしまうようになるため、この方法はお薦めできません。
FunctionSet01はyが初期化されていない状態でインスタンスが作成されてはいけないクラスだからです。
FunctionSet01 instance = new FunctionSet01() を許してはいけない)

投稿2021/05/18 07:12

編集2021/05/18 07:22
root_jp

総合スコア4666

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

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

0

ベストアンサー

FunctionSet01 は引数が1つあるコンストラクタを定義しているので、暗黙定義の0引数コンストラクタが存在しない。

FunctionSet02 は FunctionSet01 を継承しているので、FunctionSet02 のコンストラクタは、FunctionSet01 のコンストラクタを呼び出す必要がある。
FunctionSet02 のコンストラクタには明示的な super(y); 記載がないので、暗黙に super(); を呼び出そうとする。
→が、上で書いたように FunctionSet01 には FunctionSet01() が存在しないので、コンストラクタを呼び出せない

かな?

投稿2021/05/18 07:02

tacsheaven

総合スコア13703

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

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

0

クラスを継承して自分でコンストラクタを実装した場合、親クラスのコンストラクタを呼ばないといけません。そして、親クラスのコンストラクタを呼ぶコードが書かれていない場合、引数のないコンストラクタを呼ぼうとします。

FunctionSet02(int y, int m, int d)からFunctionSet01(int y)を呼ぶようにするか、あるいは逆にFunctionSet01()を用意するかで対応してください。

投稿2021/05/18 07:00

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問