JAvaプログラミング思想読書ノート

4542 ワード

本の大名は6年以上も聞いたことがあるが、長い間買ったのはひっくり返しただけだ.最近暇を見つけて通読して、一ヶ月以上かかりました.
本の翻訳はとても腐っていて、間違いも少なくありませんが、全体的に言えば、やはり恨みの遅い感じで、特に最後の同時プログラミングのほとんどの実例はすべて1回デバッグして、私に以前のコードの生涯がまだ足りないと感じさせます.
最初はメモを書きたくなくて、多くのものも記録していないかもしれませんが、今できるだけ思い出して、後期のメモを整理します.
1.javaマルチステートの概念後期バインド.以前は意外にもこの語を聞いたことがなくて、多態は何年も白学だと感じて、それに対応するのはc++虚関数です.私は以前javaのパラメータとc++の参照伝達だけを結びつけていました.
2.反射は動的プログラミングであることを理解する.プライベート呼び出しメソッドを反射できます.昔から聞いたことがありますが、他の人もこの本から学んだことがあることを今は知っていますよね.
3.  p214    ローカル内部クラスにアクセス説明子はありません!アクセス説明子とはprivate,prototced,publicが長い間理解できなかったことを指す.
4.p 219「Array.asList()の出力を直接使用することもできます」
@SafeVarargs  
public static  List asList(T... a) {  
    return new ArrayList<>(a);  
}  
しかし、このArrayListはArrayのstatic内部クラスである.だから確かにそれらの操作はサポートされていません.でもdeleteが書いたのはちょっと問題がありますか?removeメソッドのはずです.
5.p 361.」また、1つのstaticメソッドでは汎用クラスのタイプパラメータにアクセスできないため、staticメソッドは汎用の能力を使用する必要があり、汎用メソッドにしなければならない.
public class ABC {
	T t;

	public ABC(T t) {
		this.t = t;
	}

	public static void print0() {
		// System.out.println(t.getClass()); error
		//              
	}

	// public static void print1(T t) {  error
	// System.out.println(t.getClass()); 
	//              
	// }

	//     
	public static  void print2(T t) {
		System.out.println(t.getClass());
	}

	public static void main(String[] args) {
		ABC.print2(1);
	}
}
補足説明:staticメソッドは、オブジェクトを初期化する必要はありません.しかし,汎型の具体的なタイプは,オブジェクトを初期化したときに決定されるため,2点の矛盾により汎型法が必要となる.
6. p 376「汎用型は、実行時タイプの操作、例えば遷移、instanceof操作、new式を表示的に参照するために使用できません.」(実測では遷移は可能ですが、警告があります)
    解釈:java汎用は消去に基づいて実現されているため、実際に仮想マシンで実行されているときはそのタイプはありません.
                連想してみてください(汎用またはタイプ変換のコードでjavapバイトコードは一致しているので、コンパイルするときに役立つだけです)
7. p375  ”汎用型パラメータは最初の境界に消去されます」
    ここでの消去は前の文とは異なるはずです.前の文はJVMの中でタイプ情報がありません.ここでの消去は上への転換であるべきです.
8. p 389"?は単一の境界に制限されています." 
    解釈:暇があればよく検討して~「?」ワイルドカードは単一の境界ではないでしょう.
9.p 585「static情報の読み取りに問題が発生しました.」
これはよく理解できますが、staticも復元できれば、他のオブジェクトにstaticを指すデータも変化します.
例えば、Aオブジェクトにstaticデータがあるのは3.Bオブジェクトがstaticが2に等しいときstoreがあり、recoverのときに2に復元するとAオブジェクトも影響を受けます.
10.列挙はあまり好きではありません.データベースのフィールドにはint値があるので、列挙とint値をどのように変換するかよく分かりません.実際にはそうすることができます.
enum Explore { HERE, THERE }

public class Foo{

  public static void main(String[] args) {
	  System.out.println(Explore.HERE.ordinal());
	  System.out.println(Explore.values()[1]);
  }
} 

もし位置を間違えたり、マイナスになったりしたらどうしますか?自分で計算ルールを書きましょうか?
たとえば
Explore.HERE.ordinal()+1
Explore.values()[x-1]
データベースのタイプが
1,2,3,5
列挙値は依然としてONE、TWO、THREE、FOUR、FIVEを記入することができます.ただ永遠に使わないだけです.関係はまだ対応しています.
11.p 665」したがって、main()が終了すると、JVMは直ちにすべてのバックグラウンドプロセスを閉じる.だからfinnaly文は実行されません.」
     だからハドopソースを読んでいると、たくさんのHOOKが入っています.HOOKを利用して資源を解放する.これに基づいた目的だった.
例:
  public static class CompositeServiceShutdownHook implements Runnable {

    private CompositeService compositeService;

    public CompositeServiceShutdownHook(CompositeService compositeService) {
      this.compositeService = compositeService;
    }

    @Override
    public void run() {
      ServiceOperations.stopQuietly(compositeService);
    }
  }

12.p 673出力結果が本と一致しないのは不思議で、この質問と同じです.http://bbs.csdn.net/topics/390118941  理由が検索されませんでした
この質問に答える人がいない以上、newCachedThreadPoolはスレッドが異常になった後、すぐにスレッドを再作成するので、私は答えます.
呼び出すなら
    ExecutorService exec = Executors.newCachedThreadPool(
      new HandlerThreadFactory());
    exec.execute(new ExceptionThread2());
    exec.shutdown();//              。

13. p 687ページ 
メソッドはマルチステートで、プロパティはマルチステートではありません.サブクラスは、親publicのプロパティにアクセスできます.しかし、最初から最後まで、それは常に親の属性であり、子ではありません.
checkCounterのテスト.
14.
notifyAll
public final void notifyAll()

このオブジェクトモニタで待機しているすべてのスレッドを起動します.スレッドはいずれかを呼び出すwaitメソッドで、オブジェクトのモニタで待機します.
現在のスレッドがオブジェクトのロックを放棄するまで、起動したスレッドを実行し続けません.起動されたスレッドは、オブジェクト上でアクティブに同期している他のすべてのスレッドと通常の方法で競合します.たとえば、起動したスレッドは、このオブジェクトをロックする次のスレッドとして信頼できる特権や劣勢を持っていません. 
現在のスレッドが終了しない限り、notifyまたはnotifyAllを呼び出すときに他のスレッドは実行できません.またはwait()メソッドを呼び出す必要があります.
15.p 765「何気なくスレッド結合を防ぐためには、...、またはオブジェクトを接続しない必要がある...」
解释:キューに参加すると、すぐに実行されないため、まだ実行されていない場合は他の人に修正され、もちろん同時問題も発生します.
16.p 765」各オブジェクトは、自分のドメインのすべての制御権を維持します(これは通常のクラスよりも厳しく、通常のクラスはドメインを保護する選択権を持っているだけです).
説明:ドメインはプロパティです.この言葉を何度も読んでよく理解していないが、制御権と選択権、普通のクラスは、メソッドを呼び出してアクセスし、修正することができると推定されている.活動対象は、彼にコントロール権を持つべきではないことを意味します.つまり、周辺オブジェクトはそのドメインを制御できません.