【thinking in java】読書ノート(一)


最近tijを読み始めましたが、記憶力がいいのは腐ったペンに及ばないので、記録しておくと、後で調べるのに便利です.
一、各種初期化問題:
        メソッドの再ロードの問題:
        メソッドのリロードは、戻り値ではなく、メソッドのパラメータに依存することを区別します.例えばf()は,戻り値であれば曖昧になりやすい.
        メソッドのリロードでは、入力パラメータのタイプが上昇または低下します.たとえばint型を受け入れる方法があれば,char型が1つ伝わると,その方法を呼び出すと自動的に昇格する.
        可変パラメータメソッドのリロードの問題に関連する場合、いくつかの特殊な状況が発生します.
        static void f(float f, Character... c) {
		System.out.println("first");
	}

	static void f(Character... c) {//            char c1,        
		System.out.println("second");
	}
f("1","2");//         

2つ目の方法を次のように書きます.
	static void f(char c1, Character... c) {//            char c1,        
		System.out.println("second");
	}

        staticに関する初期化の問題:
        1、1つのクラスでは、静的メンバー変数または静的ブロックの初期化は、mainメソッドがクラスにある場合、mainメソッドの前に実行されます.
        2、静的メンバー変数、または静的ブロック間の初期化順序は、それらの間に現れる順序の遅かれ早かれ決定される.
        3、staticブロックは1回しか実行されず、クラスがロードされたときであるため、1つのクラスについてnewを呼び出してその構築方法を呼び出してオブジェクトを構築し、1回目であればstaticブロックはその前に実行され、その後newを行うと再実行されない.
package com.alex.example;

class Cup {
	Cup(int maker) {
		System.out.println("Cup(" + maker + ")");
	}

	void f(int maker) {
		System.out.println("f(" + maker + ")");
	}
}

class Cups {
	static Cup cup1;
	static Cup cup2 = new Cup(2);

	static {
		System.out.println("static block in Cups is running");
		cup1 = new Cup(1);
		// cup2 = new Cup(2);
	}

	Cups() {
		System.out.println("Cups()");
	}
}

public class ExplicitStatic {
	public static void main(String[] args) {
		System.out.println("Inside main");
		Cups.cup1.f(99);
	}

	static Cups cups1 = new Cups();
	// static Cups cups2 = new Cups();
}

通常ブロックの初期化
クラスの通常のブロックのコードは、常にこのオブジェクトを作成する前に呼び出され、オブジェクトを作成するたびに呼び出されます.staticブロックのように、ロードクラスの最初の呼び出しだけが呼び出されるわけではありません.
package com.alex.example;

class People {

	{
		System.out.println("People         ");
	}

	String name;
	int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public People(String name, int age) {
		super();
		System.out.println("People         ");
		this.name = name;
		this.age = age;
	}

	public People() {
		super();
		System.out.println("People         ");
	}

	@Override
	public String toString() {
		return "People [name=" + name + ", age=" + age + "]";
	}

}


public class Test {
	People p1;
	People p2;
	{
		System.out.println("Test         ");
		p1 = new People();
	}

	public static void main(String[] args) {
		System.out.println("Inside main");
		System.out.println("t1   ");
		Test t1 = new Test();
		System.out.println("t2   ");
		Test t2 = new Test();
	}

}

結果:
Inside main
t1   
Test         
People         
People         
t2   
Test         
People         
People         

二、ゴミ回収の問題:
Javaのごみ回収は,適応的,世代別,停止−複製,マーキング−清掃式のごみ回収と簡単に要約できる.
停止→コピー
すべてのスレッドを停止し、stop the worldし、回収しないデータを使用していないメモリにコピーし、残りのメモリ内容をクリーンアップします.時間がかかる.
マーク→清掃
タグ-スキャンもスレッドを停止し、回収するデータをタグ付けして回収する必要があります.これにより、一般的には上よりも速くなりますが、メモリの破片が発生します.
てきおう
適応とは、Java仮想マシンは、適応し、ゴミが多い場合は停止コピーを採用し、ゴミが少ない場合は安定期に入る場合はマーククリーンアップを採用することを意味します.
ぶんかつ
分代の意味は、メモリの中のデータのブロックを標定して、もし1つのデータのブロック、1回のごみの回収を我慢したことがあるならば、それではその代数に1をプラスして、数回のデータを我慢したことがあって、古い年代のメモリの中で行うことができて、いくつかの比較的大きいデータに対して、それが生んで直接古い年代に入ることができて、新しい世代ではありませんそのため、私たちは頻繁にいくつかのライフサイクルが短く、膨大なデータを作成しないほうがいいです.これはJVMが頻繁に完全なゴミ回収を行う可能性があります.