2017-11-26 30 views
1

ここでコードを実行すると、出力としてcalledが得られます。理由はわかりません。called new 1はshortintの両方の範囲になるため、同じ番号の2つのコンストラクタ。パラメータは異なりますがデータ型が異なります

public class MyClass { 

     private int x; 

     public MyClass(){ 
      this(1); 
     } 

     public MyClass(int x){ 
      System.out.println("called"); 
      this.x = x; 
     } 

     public MyClass(short y){ 
      System.out.println("called new"); 
      this.x = y; 
     } 

     public static void main(String args[]) { 
     MyClass m = new MyClass(); 
      System.out.println("hello"); 
     } 
    } 

答えて

5

1リテラルintので、MyClass(int x)が選択されます。

MyClass(int x)コンストラクタを削除しても、MyClass(short y)は選択されません。 1shortではないため、コンパイルエラーが発生します。

MyClass(short y)を選択するには、this((short)1);を短くする必要があります。

short s = 1; 
int i = 1; 

そして、呼び出されているMyClassのどのコンストラクタチェック:他人への追加として

+0

どのように1が短くないかを確認しないでください – Coder17

+3

@ Coder17コンパイラが「int」であるとみなした場合、どのように小さくても大きければ、接尾辞を持たない整数の数値リテラルです。コンパイラは 'int'リテラルの値をチェックして' short'変数に収まるかどうかを判断しません。コンパイラがこのようなチェックを行うのは、 'int'リテラルを' short'変数に代入するときだけです。 – Eran

+0

情報ありがとうございます – Coder17

0

は、私はあなたが同じリテラルを使用して、他の種類の変数を初期化するとき、コンストラクタが呼び出さされているか確認するためにあなたを提案することができ答えますあなたが上記の引数でそれらを呼び出すとき。

関連する問題