7、java面接問題2

2479 ワード

1、下記のコードを分析する
class Confusing 
{
	private Confusing(Object o)
	{
		System.out.println("Object");
	}
	private Confusing(double[] dArray)
	{
		System.out.println("double array");
	}
	public static void main(String[] args) 
	{
		new Confusing(null);
	}
}
  • 実行結果:double array
  • Javaのリロード解析プロセスは2段階で実行されます:
  • 第1段階は、入手可能で適用可能なすべての方法またはコンストラクタを選択する.
  • 第2のフェーズは、第1のフェーズで選択された方法またはコンストラクタの中で最も正確な1つを選択する.
  • ある方法またはコンストラクタが別の方法またはコンストラクタに伝達される任意のパラメータを受け入れることができる場合、第1の方法は第2の方法よりも精度に欠けていると述べた.
    new Confusing((Object)null);
  • は、Confusing(Object)のみが適用可能であることを保証する.より一般的には、コンパイラに正確なリロードバージョンを選択するように強制するには、実際のパラメータを形式パラメータで宣言されたタイプに変換する必要があります.
  • がこのようにして複数のリロードバージョンで選択されるのはかなり不快である.
  • あなたのAPIでは、クライアントがこのような極端に進まないことを確認する必要があります.
  • 理想的な状態では、リロードを避けるべきです.異なる方法に異なる名前を付けます.
  • リロードを行った場合は、すべてのリロード・バージョンで受け入れられるパラメータ・タイプが互いに互換性がないことを確認してください.これにより、両方のリロード・バージョンが同時に適用されないことを確認します.
  • それができない場合は、すべての適用可能なリロードバージョンが同じ動作をしていることを確認してください.
  • つまり、リロードされたバージョンの解析が混同される可能性があります.
  • は、重荷をできるだけ避けるべきであり、重荷をしなければならない場合は、このような混同を最小限に抑えるために、上記の方針を守らなければなりません.
  • 設計の悪いAPIが異なるリロード・バージョン間で選択を強制する場合は、実際のパラメータを呼び出したいリロード・バージョンの形式パラメータが持つタイプに変換します.

  • 2、コード分析
     
    class Demo2
    {
    	public static void main(String args[])
    	{
    		StringBuffer s=new StringBuffer();
    		s.append(1>5?100:'A');
    		s.append(6>5?90:'B');
    		System.out.println(s);
    		
    		s.delete(0,s.length());
    		int i = 90;
    		s.append(1>5?i:'A');
    		s.append(6>5?i:'B');
    		System.out.println(s);
    
    		s.delete(0,s.length());
    		s.append(1>5?(int)100:'A');
    		s.append(6>5?(int)90:'B');
    		System.out.println(s);
    
    		System.out.println(6>5?100:'b');
    		System.out.println(1>5?'b':100.5);
    	}
    }
    // :AZ 6590 AZ d 100.5
  • jvmは、演算に関与するデータクラスの推定タイプに基づいて、どのメソッド
  • を使用するかを推定する.
  • 90をint iに割り当てると、「A」と「B」とiがint型に演算され、append(int)という方法が使用されるので、結果は6590
  • となる.
  • その他の場合、90,100はいずれも定数として存在し、文字と演算する場合、データ型が指定されておらずcharというデータ型で表すことができるため、char型として保存される.append(char)
  • を使用しています
  • 強制タイプ変換を使用しても無視されます.定数のデータ型変換はコンパイラコンパイルの前に一歩進むため、強制タイプ変換の役割を果たすことはありません.