標準クラスについて

#日付の扱い方
日付を扱う方法は大きく以下の通り
・long型の変数に格納
・java.date.utilクラスを利用
・Calenderクラスを利用
・SimpleDateFormatクラスの利用

##long型の変数に格納

###**特徴**
・long型の変数は、1970/1/1 00:00:00（エポック）を基準に、経過したミリ秒数（1/1000）で日時情報を表現。
・long型の変数は、11223344・・・といった数値の羅列のため、コンピューターにとって分かり易い。

###**現在の日時を調べる方法**
`long 変数名 = System.currentTimeMillis();`：
System.currentTimeMilliは**ミリ秒で表される現在の時間を返す。**

###**問題点**
・「11223344」といった、数値の羅列は人間は理解出来ない・・・
・long型のデータは、他にも使用されるため、中に入っているデータが日付かどうか分からない。

##java.date.utilパッケージに格納

###**特徴**
**Date型の変数なら、中身は日時情報**という判別が付く。

###**使用方法**

####「クラスをインポート」
java.date.utilクラスを`import`する

####「現在日時を持つ、Dateインスタンスを生成」
`Date 変数名 = new Date();`

####「long値引数時点の日時を持つ、データインスタンスを生成」
`Date 変数名 = new Date(long値の引数);`

###**使用例**

```java
Date now = new Date();//①Dateインスタンスを生成し、現在日時を得る。
System.out.println(now);//出力結果①
long nowTime = now.getTime();//②Dateインスタンスの、getTimeメソッドを使用しlong値の現在日時を得る
System.out.println(nowTime);//出力結果②
Date past = new Date(nowTime);//③long値を代入して、新たにデータインスタンスを生成する
System.out.println(past);//出力結果③
```

####「出力結果」
```java
Sat Mar 03 11:41:38 JST 2018//①
1520044898396//②
Sat Mar 03 11:41:38 JST 2018//③
```
###**問題点**
やはり、long値を使用しているので読みづらい・・・

##Calenderクラスを利用

###**特徴**
`Date`クラスで得たlong型データを、`Calender`クラスにて、int型データとの相互変換が可能。

###**使用方法**

####「Calenderクラスを利用して、int型引数でDate型データを生成」
`java.util.Calendar;`をインポートする

####「Calenderクラスを利用して、int型引数でDate型データを生成」
`Calendar インスタンス名　= Calendar.getInstance();`//Calendarクラスのインスタンスを生成
`インスタンス名.set（年、月、日、時、分、秒）;`//インスタンスにint型で日時情報を入力※月は0~11で設定！！
または
`インスタンス名.set(Calendar.~,値);//`
`Date 変数名　 = c.getTime();`//Date型データの取り出し

####(Calenderクラスからint型のデータを取り出す方法)
`int year   =Calenderクラス変数.get(Calendar.YEAR);`
`int month  =Calenderクラス変数.get(Calendar.MONTH);`
`int day    =Calenderクラス変数.get(Calendar.DAY_OF_MONTH);`
`int hour   =Calenderクラス変数.get(Calendar.HOUR);`
`int minute =Calenderクラス変数.get(Calendar.MINUTE);`
`int second =Calenderクラス変数.get(Calendar.SECOND);`

####「CalenderクラスにDate型のデータを入れる方法」
`インスタンス名.setTime(Date型の引数);`

###**使用例**
```java
	public static void main(String[] args) {
		//インスタンスを生成
		Date now = new Date();//Dateクラスのnowインスタンスを生成し、現在日時を取得
		Calendar calendar = Calendar.getInstance();//Calendarクラスのcalendarインスタンスを生成
		
		//①calendarインスタンスから、年のみをint型で取り出す
		calendar.setTime(now);//①calenderインスタンスにnowインスタンス（現在日時）を代入
		int year = calendar.get(Calendar.YEAR);//①calenderクラスから、年のみ取り出す
		System.out.println(year);//出力結果①
		
		//②int型で年月を設定
		calendar.set(1995,1,20,10,10,10);//②calenderインスタンスにint型で年月を設定
		Date past = calendar.getTime();//②設定した年月をDate型の変数pastへ代入
		System.out.println(past);//出力結果②
	}
```

####「出力結果」
```java
2018//①
Mon Feb 20 10:10:10 JST 1995//②
```

##SimpleDateFormatクラスの利用
###**特徴**
`Date`クラスで得たlong型データを、`SimpleDateFormat`クラスにて、String型データとの相互変換が可能。

###**使用方法**

####「クラスをインポート」
`java.text.SimpleDateFormat;`クラスをインポート

####「Date型からString型を生成する」
`SimpleDateFormat 変数名 = new  SimpleDateFormat(書式文字列);`//インスタンスを生成する
`String 変数名　= SimpleDateFormatインスタンス名.format(Date型変数);`//SimpleDateFormatクラスのformatメソッドで、型をDate→Stringに変換する

####「String型からDate型を生成する」
`SimpleDateFormat 変数名 = new  SimpleDateFormat(書式文字列);`//SimpleDateFormatクラスのインスタンスを生成する
`Date Date型変数名　= SimpleDateFormatインスタンス名.parse(文字列);`//SimpleDateFormatクラスのparseメソッドで、型をString→Dateに変換する
※書式文字列はyyyy/MM/dd`の様に出力したいフォーマットを指定する

###**使用例**

```java
	public static void main(String[] args) throws Exception {
		//インスタンスを生成
		Date now = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

		//Date型→String型
		String date = format.format(now);

		//String型→Date型
		Date past = format.parse("1995/01/20 10:10:10");

		//出力
		System.out.println(date);
		System.out.println(past);
	}
```

####「出力結果」
```java
2018/03/03 15:59:07
Fri Jan 20 10:10:10 JST 1995
```

##暗黙の継承
###**考え方**
クラスを定義するとき、`extend`で親クラスを指定しなければ、親クラスに`java.lang.Object`を継承した事になる。

###**java.lang.Objectの中身**
・`equals()`：あるインスタンスと自分自身が同じか調べる
・`toString()`：自分自身の文字列内容を返す

###**暗黙の継承のメリット**
####①Objectを引数として使用出来る
####「例」

```java
	public static void main(String[] args) {
		Object[] o = new Object[2];
		o[0] = new Hero();
		o[1] = "こんにちは";
		for(Object ox:o) {
			System.out.println(ox);
		}
	}
```
#####「出力結果」

```java
Java14.Hero@70dea4e
こんにちは
```



多態性によって、全てのオブジェクトはざっくり`Object`とみなせるため、**引数＝何でも良い**時に`Object`を指定出来る。

####②全てのクラスに最低限必要なメソッドを備える事が出来る。

###**toStringについて**
####「デフォルト」
型名@英数字

```java
//Heroインスタンスを出力した場合
Java14.Hero@70dea4e
```

####「変えたいなら」

```java
@Override
public String toString(){
　return "名前は"+this.name・・・
}
```
上記の様に出力方法を**オーバーライド**する必要がある。
`@Override`はオーバーライドしますという意味。

###**equalsについて**
ざっくりいうと、同じかどうかの判断をする。同じかどうかの判断は通常`==`で行うが、equalsは少し違った`等価判定`というものをする。

####「等値　==」
全く同じである状態

```java
Hero h1 = new Hero;
Hero h2 = h1;
```
この場合、h1とh2は等値である。

####「等価 equals」
同じ内容である状態

```java
Hero h1 = new Hero("ヨシヒコ")
Hero h2 = new Hero("ヨシヒコ")
```
この場合h1とh2は、それぞれ別のインスタンスだが、中身が同じのため等価である。

####「使用方法」
しかし、デフォルトの`equals`は等値判定となっているため、等価判定に修正して使用する必要がある。

####「例」

```java
//mainクラス
	public static void main(String[] args) {
		Hero hero1 = new Hero();
		hero1.name = "ヨシヒコ";
		hero1.hp = 100;

		Hero hero2 = new Hero();
		hero2.name = "ヨシヒコ";
		hero2.hp = 100;

		if (hero1.equals(hero2) == true) {
			System.out.println("同じ内容です");
		} else {
			System.out.println("違う内容です");
		}
	}
```

```java
//Heroクラス
public class Hero {
	String name;
	int hp;
	
    //equalsの書き変え
    @Override
	public boolean equals(Object o) {
		if (this == o) {//等値だった場合はtrue
			return true;
		}
		if (o instanceof Hero) {//同じクラスもしくは、親子関係のクラスの場合
			Hero h = (Hero) o;//Objectクラスの変数oをHeroクラスの変数hにキャスト変換して、Hero型変数hに代入
			if (this.name.equals(h.name)) {//名前が等しければ等価
				return true;
			}
		}
		return false;
	}
}
```

####「出力結果」

```java
同じ内容です
```


##ラッパークラス
###ラッパークラスとは
intなどの基本データ型に対応したクラス

###ラッパークラスのメリット
####「メソッドが使用できる」
メソッドは全て`static`で記載されているため、ラッパークラスをインスタンス化せずに使用する事が出来る。

####「インスタンスとして扱える」
基本データ型としてそのまま扱えないAPIがいくつかあるため、わざわざ一度インスタンス化させて数値を持たせる。

#####「使用例」

```java
		int i1 = 15;//int型の変数i1に15を代入
		Integer i2 = Integer.valueOf(i1);//i2インスタンスの生成
		System.out.println(i2);
```
valueOf：指定された int 値を表す Integer インスタンスを返すメソッド

#####「出力結果」
```java
15
```
###基本データ型とラッパークラスの変換

####通常だと

```java
		int i1 = 15;//int型の変数i1に15を代入
		Integer i2 = Integer.valueOf(i1);//i2インスタンスの生成・int型→Integer型に変換
		int i3 = i2.intValue();//Integer型→int型に変換
```
intValue： Integer の値を int として返すメソッド

これだとデータの変換に毎回メソッドを使う必要がある・・・

####「AutoBoxing・AutoUnboxing機能」
ラッパークラス型⇆基本データ型の変換時は自動で、`valueOf`や`intValue`が行われる。
このAutoBoxing・AutoUnboxing機能はデフォルトで備わっている。

```java
		int i1 = 15;//int型の変数i1に15を代入
		Integer i2 = i1;//int型→Integer型に自動変換
		int i3 = i2;//Integer型→int型に自動変換
```