日付の扱い方
日付を扱う方法は大きく以下の通り
・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値の引数);
使用例
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);//出力結果③
「出力結果」
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型の引数);
使用例
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);//出力結果②
}
「出力結果」
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`の様に出力したいフォーマットを指定する
使用例
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);
}
「出力結果」
2018/03/03 15:59:07
Fri Jan 20 10:10:10 JST 1995
暗黙の継承
考え方
クラスを定義するとき、extend
で親クラスを指定しなければ、親クラスにjava.lang.Object
を継承した事になる。
java.lang.Objectの中身
・equals()
:あるインスタンスと自分自身が同じか調べる
・toString()
:自分自身の文字列内容を返す
暗黙の継承のメリット
①Objectを引数として使用出来る
「例」
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);
}
}
「出力結果」
Java14.Hero@70dea4e
こんにちは
多態性によって、全てのオブジェクトはざっくりObject
とみなせるため、引数=何でも良い時にObject
を指定出来る。
②全てのクラスに最低限必要なメソッドを備える事が出来る。
toStringについて
「デフォルト」
型名@英数字
//Heroインスタンスを出力した場合
Java14.Hero@70dea4e
「変えたいなら」
@Override
public String toString(){
return "名前は"+this.name・・・
}
上記の様に出力方法をオーバーライドする必要がある。
@Override
はオーバーライドしますという意味。
equalsについて
ざっくりいうと、同じかどうかの判断をする。同じかどうかの判断は通常==
で行うが、equalsは少し違った等価判定
というものをする。
「等値 ==」
全く同じである状態
Hero h1 = new Hero;
Hero h2 = h1;
この場合、h1とh2は等値である。
「等価 equals」
同じ内容である状態
Hero h1 = new Hero("ヨシヒコ")
Hero h2 = new Hero("ヨシヒコ")
この場合h1とh2は、それぞれ別のインスタンスだが、中身が同じのため等価である。
「使用方法」
しかし、デフォルトのequals
は等値判定となっているため、等価判定に修正して使用する必要がある。
「例」
//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("違う内容です");
}
}
//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;
}
}
「出力結果」
同じ内容です
ラッパークラス
ラッパークラスとは
intなどの基本データ型に対応したクラス
ラッパークラスのメリット
「メソッドが使用できる」
メソッドは全てstatic
で記載されているため、ラッパークラスをインスタンス化せずに使用する事が出来る。
「インスタンスとして扱える」
基本データ型としてそのまま扱えないAPIがいくつかあるため、わざわざ一度インスタンス化させて数値を持たせる。
「使用例」
int i1 = 15;//int型の変数i1に15を代入
Integer i2 = Integer.valueOf(i1);//i2インスタンスの生成
System.out.println(i2);
valueOf:指定された int 値を表す Integer インスタンスを返すメソッド
「出力結果」
15
基本データ型とラッパークラスの変換
通常だと
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機能はデフォルトで備わっている。
int i1 = 15;//int型の変数i1に15を代入
Integer i2 = i1;//int型→Integer型に自動変換
int i3 = i2;//Integer型→int型に自動変換