Java学習ノート_14016（クラス）

# クラスを使いこなす

## ネストクラス

* メンバクラス : トップレベルのクラスのメンバとして宣言するクラス 
* ローカルクラス : メソッドなどのブロック内のクラス
* 無名クラス : 名前のないクラス

## メンバクラス

```java:NestedClassSample.java
class AClass {
	String message;
	static void doTopMethod(){
		System.out.println("AClassメンバのdoTopMethodが呼び出されました");
	}
	//メンバクラス
	class NestedClass{
		public NestedClass() {

		}
		void  doNestedClassMethod(){
			doTopMethod();
			System.out.println("NestedClassからdoNestedClassMethodが呼び出されました");
		}
	}
}
class NestedClassSample{
	public static void main(String[] args) {
		AClass a = new AClass();
		a.doTopMethod();
		//ネストされたクラスはネスト元のクラスからしか呼び出せないので以下はコンパイルエラー
		//NestedClass b = new NestedClass();
		
		//この書き方も変な感じする
		AClass.NestedClass b = a.new NestedClass();
		b.doNestedClassMethod();
	}
}
```

## ローカルクラス

```java:LocalClassSample.java

public class LocalClassSample {
	public static void main(String[] args) {
		
	}
	static void method(){
		final String message = "hello";
		
		class myThread extends Thread{
			public void run(){
				System.out.println(message);
			}
		}
		Thread t = new myThread();
		t.start();
	}
}
```
## 無名クラス

無名クラスを使うことで、クラス宣言する記述を省略できる。またインターフェイスや抽象クラスをその場でインスタンス化できる簡単な方法として利用できる（けどわかりづらい気がする）。

## ガベージコレクション

プログラムを動作させるときに、メモリ領域を確保し、不要になると解放するという処理が必要になる。メモリ管理にバグがあると、メモリリークや暴走などを引き起こします。

メモリリークは使えるメモリが徐々に少なくなっていき、やがてプログラムが強制終了する。暴走は、プログラムが異常な動作をして制御不能になること。

Javaは使われなくなったインスタンスが専有しているメモリを自動的に収集と開放をすることで、メモリリークのような深刻な問題箇所を特定している。これをガベージコレクション（ごみ収集という意味）と言う。

## 列挙型（enum)

定数の集合を扱うための型。Java5で導入された機能。enumerate（列挙する）の略のようだ。


```java:EnumSample.java
public class EnumSample {
	public static void main(String[] args) {
		BloodType b = BloodType.B;
		System.out.println(b);

		System.out.println(b.name());

		System.out.println(b == BloodType.A);
		System.out.println(b == BloodType.B);

		BloodType[] values = BloodType.values();

		for(BloodType value : values){
			System.out.print(value + ",");
		}
	}
}
```

public class EnumSample {
	public static void main(String[] args) {
		BloodType b = BloodType.B;
		System.out.println(b);

		System.out.println(b.name());

		System.out.println(b == BloodType.A);
		System.out.println(b == BloodType.B);

		BloodType[] values = BloodType.values();

		for(BloodType value : values){
			System.out.print(value + ",");
		}
		System.out.println("\n");
		BloodType type = BloodType.AB;
		switch(type){
		case A: 
			System.out.println("血液型はAです");
			break;
		case B: 
			System.out.println("血液型はBです");
			break;
		case O: 
			System.out.println("血液型はOです");
			break;
		case AB: 
			System.out.println("血液型はABです");
			break;
			
		}
	}
}


なんか自分の知ってるのと違うと思ってたら、それevalだった。アカン、年だ。

## switch文で列挙型を使う

も上のサンプルに追記してみた。

## 列挙型でのメソッド定義

```java:EnumSample2.java
enum Job{
	会社員("0A"),
	自営業("0B"),
	ニート("05"),
	その他("99");

	private final String code;

	private Job(String code) {
		this.code = code;
	}

	String getJobCode(){
		return code;
	}
}
class EnumSample2 {
	public static void main(String[] args) {
		Job job = Job.valueOf("会社員");
		System.out.println(job.name());
		System.out.println(job.getJobCode());
	}
}
```

き、気持ち悪い。これはJavaでUnicodeがクラス名、メソッド名、変数名に使えることに起因してるというか使用に依っているかららしい。

## EnumSetとEnumMap

EnumSet,Enummapという便利なクラスがある。らしいけど、別に説明はされないのかな。

## staticインポート

Java5以降では、ほかクラスのスタティックなフィールドやメソッドをインポートできる。

`import static <完全限定クラス名>.<staticメンバ>;`

```java:StaticImportSample.java

import static java.lang.Math.PI;
import static java.lang.Math.abs;

public class StaticImportSample {

	public static void main(String[] args) {
		double pi = PI;
		System.out.println(pi);

		int num = abs(-199);
		System.out.println(num);
	}
}
```

文法セクションが終わった。