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

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

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

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

Q&A

解決済

3回答

7198閲覧

コンストラクタの定義が上手くいきません

dokodoko486

総合スコア25

Java

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

0グッド

0クリップ

投稿2017/06/25 00:31

java

1public class Human{ 2private String name; 3private int birthday; 4Human(String a, int b){ 5this.name=a; 6this.birthday=b; 7} 8}

上はクラスHumanです。

java

1public class Animal{ 2public void addHuman(String name,int IQ){ 3Human h = new Human(name,IQ); 4} 5} 6

上はAnimalクラスです。
HumanクラスのコンストラクタをAnimalクラスで呼び出しているのですが、上手くいきません。
「クラスHumanのコンストラクタHumanは指定された型に適用できません。
期待値:引数がありません。
検出値:String,int
理由;実引数と仮引数リストの長さが異なります」
というエラーがでました。Humanのコンストラクタの引数はString aとint bできちんと定義しているはずなのに、なぜこのエラーがでるのか不思議です。どこが間違っているのでしょうか。教えて下さい。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

解決済みですが、少々気になったのでちょっと試してみたことをコメントします。


IDEではなくjavacを使ってコンパイルしておられると思います。

A-pZさんの1番目の回答があたりに思えるのですが、少々複雑な状況に思えます。

(1) 最初はHuman.javaにコンストラクターの定義がなかった
(2) その状態でHuman.javaをコンパイルした
(3) Human.javaを編集しコンストラクターの定義を追加した
(4) Human.javaをコンパイルせずに何かおかしな操作をした
例えばtouch Human.classとしてHuman.javaよりHuman.classの日付を新しくしてしまった。またはHuman.javaの日付を古くしてしまった・・・
(5) Animal.javaをコンパイルした

(4)のようなおかしなことをしなければHuman.javaをコンパイルしなおさなくても(5)のコンパイル時にjavacが「Human.classはあるけど、Human.javaより古いからもう一度コンパイルしてあげましょう」と気を利かせてくれるのですが、(4)をやってしまうと「Human.classは最新だからコンパイルしなおす必要はない」とjavacが判断してしまい結果としてご質問のようなエラーになってしまいます。(Windows10 jdk1.8.0_131でやってみました)

# 実験結果 $ javac Animal.java Animal.java:3: エラー: クラス Humanのコンストラクタ Humanは指定された型に適用できません。 Human h = new Human(name, IQ); ^ 期待値: 引数がありません 検出値: String,int 理由: 実引数リストと仮引数リストの長さが異なります エラー1個

普通にプログラムを書いてjavacを動かせばこうしたことは起こらないように思えるのですが・・・何かやっちゃたのかも知れませんね。

ちなみに、「ソースが正しいのにおかしなコンパイルエラーがでる」と思ったらこういうふうにしてみるのも手かも知れません。

$ javap Human.class Compiled from "Human.java" public class Human { public Human(); }

javapはクラスファイルの内容を簡単にダンプするコマンドなのですが上をみると「あれれ!Humanのコンストラクターを定義したはずなのにそれが入ってない!」ということに気付けたりします。普通はこんなことしなくてもよいはずなのでトリビア的な話ですが・・・

投稿2017/06/25 03:08

KSwordOfHaste

総合スコア18394

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

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

0

ベストアンサー

記載されているコードそのものは特に問題はありませんが、以下を確認してください。

  1. Humanクラスがコンパイル済みであること
  2. HumanクラスとAnimalクラスが同一パッケージにあること

2番目の理由としては、Humanのコンストラクタがpublicでないため、同一パッケージにないと参照できないためです。

投稿2017/06/25 01:02

A-pZ

総合スコア12011

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

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

swordone

2017/06/25 01:20

2なら「シンボルが見つけられない」エラーになるはずなので、現状1の可能性が高いと思います。
guest

0

2つのクラスを作成して下記のようなmain関数で使用してみましたが特にエラーはでていないようです。

Java

1public class mainApp { 2 3 public static void main (String args[]){ 4 Animal a = new Animal(); 5 a.addHuman("tiger", 50); 6 } 7 8}

AnimalとHumanに下記のように追記して結果を確認できるようにしました。

Java

1public class Animal { 2 3Human newH ; 4 5public void addHuman(String name,int IQ){ 6Human h = new Human(name,IQ); 7this.newH = h; 8} 9 10}

Java

1public class Human { 2private String name; 3private int birthday; 4 5Human(String a, int b){ 6this.name=a; 7this.birthday=b; 8} 9 10public int getBirthday() { 11 return birthday; 12} 13 14}

下記のmainで使用すると50という結果が得られるので問題なく使用されているように思います。
回答になってないようですが、ご参考になればと思います。

Java

1public class mainApp { 2 3 public static void main (String args[]){ 4 Animal a = new Animal(); 5 a.addHuman("tiger", 50); 6 System.out.println(a.newH.getBirthday()); 7 } 8 9}

投稿2017/06/25 01:25

IroIroShiritai

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問