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

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

ただいまの
回答率

88.77%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 4,842

dokodoko486

score 25

public class Human{
private String name;
private int birthday;
Human(String a, int b){
this.name=a;
this.birthday=b;
}
}


上はクラスHumanです。

public class Animal{
public void addHuman(String name,int IQ){ 
Human h = new Human(name,IQ);
}
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/25 10:20

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

    キャンセル

+2

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


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のコンストラクターを定義したはずなのにそれが入ってない!」ということに気付けたりします。普通はこんなことしなくてもよいはずなのでトリビア的な話ですが・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

public class mainApp {

    public static void main (String args[]){
    Animal a = new Animal();
    a.addHuman("tiger", 50);
    }

}

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

public class Animal {

Human newH ;

public void addHuman(String name,int IQ){ 
Human h = new Human(name,IQ); 
this.newH = h;
}

}
public class Human {
private String name;
private int birthday;

Human(String a, int b){
this.name=a;
this.birthday=b;
}

public int getBirthday() {
    return birthday;
}

}

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

public class mainApp {

    public static void main (String args[]){
    Animal a = new Animal();
    a.addHuman("tiger", 50);
    System.out.println(a.newH.getBirthday());
    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る