【2020/05/29】学んだこと
・getter,setter
・javaではソースファイルにpublicなクラスは一つだけ
・フィールドは基本的にはprivateに。細かなメソッドで管理。
・フィールド変数に値を入力するメソッドをSetter、値を引き出すメソッドをgetterと呼ぶことが多い。
・static修飾子
・staticをつけると、インスタンスではなくクラスごとに情報をまとめて扱うことができる。(例えば、あるクラスのインスタンスは何個ある、それを表示するメソッドを作成する、など)
・main()にもstaticが付いているが、これは起動時にインスタンスを作成しなくてもいきなりソフトを動かすための仕様、と理解しておく。
・イニシャライザ
・イニシャライザ:staticに対するコンストラクタ(初期設定)。クラス変数が配列など、複雑な初期化のときに有効。static{}で書ける。
・インスタンスイニシャライザ:{}で書ける。コンストラクタがオーバーロードされて複数ある場合などに共通処理として使うことができる。
・インスタンスイニシャライザはインスタンス化前、コンストラクタはインスタンス化された後に実行される。
・final修飾子
・final修飾子:変更不可。クラスに使うと継承不可、メソッドに使うとオーバーライド不可、変数に使うと定数化(static final 大文字 で書くことが多い。どのみち定数なのでインスタンスごとではなくクラスで管理すればよいという発想からstatic)
・抽象クラス
・抽象クラス:継承されることを前提としたクラス。
クラス前にabstractを付ける。
・抽象メソッド:オーバーライドされることを前提としたクラス。
メソッド前にabstractを付ける。オーバーライド先で中身を具体的に書く。
・↑いずれも開発規模が大きくなってきたときに見やすくなる。
・「Identifierがありません」エラー:メインのクラスにmain()を書き忘れている可能性。
・インターフェース
・インターフェイスによってクラスの機能を拡張することができる。
・インターフェイスの中の定数はpublic static finalを省略できる
・インターフェイスの中の抽象メソッドはpublic abstractを省略できる
・defaultメソッドはインターフェイス内で直接実装可能
・インターフェイスをクラスに使う場合は、implements インターフェイス名
・一つのクラスに複数のインターフェイスを適用させることができる。
・列挙型
・列挙型:複数の値(数値でもデータでも)をまとめて持つことができる。
・列挙型は名前をつけることができる
・switch文との相性が良い
・ordinal()メソッドをもつ、変数のインデックスを取得可能
・列挙型はクラスの特殊型なので、内部にフィールドやメソッドを持つことが可能。
・例外処理
・例外処理の基本はtry{}catch{}finally{}
・自分で新しく例外処理を創りたい場合は例外クラスを作成し、
try{throw new 例外クラス}...}catch(例外クラス 変数)
・どのようなクラスのエラーが発生しているかはコンソールから確認
・ラッパークラス
・基本データ型にはそれぞれラッパークラスという対応する参照型のクラスが存在する
・Integer i = new Integer(32);
int n = i.intValue();が基本的な書き方。
・適当に書いても上手くやってくれる。auto boxing(ラッパー型へ),auto unboxing (基本データ型へ)
・参照型であるラッパークラスと基本データ型の違いは明確に意識。
ラッパークラスはまずメモリの番地を変数に入れている。中身になにもないときはnullとできる。
・ジェネリクス←本日の便利!!!
・ジェネリクス:複数の型に対して同じような処理をするときに、複数の型を受け入れるクラスやメソッドを作成できる。コードがスッキリ書けて便利!!!
・class クラス名<Tなど受けたい型の変数,まだ型は不定>{
Tを用いた処理
}
…
実行時(インスタンス作成時)に型を決めて<>の中に書く。ただし参照型のみ(intなどデータ型は指定できない!)
クラス名<参照型の型> 変数名 = new クラス名<>();
・スレッド処理
・Thread処理:同時並行して処理が行われる書き方。GUIなどに使うことがある。
・スレッド開始はスレッド型のインスタンスを作成し、その引数として処理したい内容のインスタンスを渡す
・スレッド型.start()で処理が進む。
・無名クラス、ラムダ式
・無名クラス:抽象メソッドをその場で実装。
・ラムダ式:(引数)->{処理}でコンパクトに書ける。関数型インターフェース(抽象メソッドを一つだけ持つインターフェースのこと。)の書き換えに向く。
・Stringの便利な使い方
public class MyString{ public static void main(String[] args){ String s = "abcdef"; System.out.println(s); System.out.println(s.length());//文字列の文字数を返すメソッド System.out.println(s.substring(2,5));//部分文字列を返す。 System.out.println(s.replaceAll("ab","AB"));//文字列の部分置換。非破壊的。 System.out.println(s); //文字列の比較 //実は中身が同じものを2つ宣言すると、同じメモリ領域が使われている。 String s1 = "abcdef"; String s2 = "abcdef"; //中身が同じでも明示的に別のメモリ領域を使いたいときは new String("hogehoge") String s3 = new String("abcdef"); String s4 = new String("abcdef"); //文字列の一致はequals()メソッド System.out.println(s1.equals(s2)); //==はメモリのどこに格納されているか、データの格納先番地の一致をチェックする System.out.println(s1 == s2);//Trueになるはず //データの格納先を明示的に分けたのでfalseになるはず System.out.println(s3 == s4); } }
・printfメソッド
・書式を指定して標準出力したい場合はprintf()
・%10s:10文字にして右詰め、%-10d:10桁にして左詰め、%5.3f:整数部分5桁、小数部分3桁の浮動小数点
・書式を指定して文字列を格納したい場合はString.format("",):クラスメソッド
・Math,Randomクラス
・Mathクラスは特にインポート不要。Math.メソッド名
・乱数はimport java.util.Random;
・乱数はインスタンス化して使う。
・nextDouble()//0-1
・nextInt(100)//0-100
・nextBoolean()//True or False
・ArrayListクラス
・Javaでは配列は後から要素の追加や削除が苦手。
→ArrayListもしくはListインターフェース(検索が早い)or LinkedList(追加削除が早い)
・↑はジェネリクスを使った型なので、インスタンス化時はList
・要素数はsize()メソッド
・要素の追加はadd()メソッド
・要素変更はset(インデックス,データ)
・要素削除はremove(インデックス)
・import java.util.*;をお忘れなく!
・HashSetクラス
・Mathクラスは特にインポート不要。Math.メソッド名
・重複を許さず、中身の順番がどうでも良い(インデックス不要)ならHashSetクラス
・Setで宣言も可。
・for文で回したときの順番は保証されない
・TreeSetは値順、LinkedHashSetは追加した順番が保持される
・HashMapクラス
・HashMap:Pythonで言うところの辞書型
・Map
・hogehoges.put("key1",value1);で要素追加。
・hogehoges.get("key1");でvalue1取得。
・全ての中身を見るにはfor文を使う。
for(Map.Entry
hogehoges.entrySet()){
hogehoge.getKey();
hogehoge.getValue()};という書き方が簡単。
・Stream API←本日の難しい!!!
・streamというコレクションを簡単に扱う方法がある。
・import java.util.*;をお忘れなく!
・書き方の基本は
hogehoge
.stream()
//中間処理
.filter()//ラムダ式が使える。データの選別が可能。
.map()//ラムダ式が使える。データの形成。元のコレクションとは別のところに一旦保持している状態。
//終端処理
.forEach()//メソッド参照と言って、メソッドを渡すことができる。
・日時クラス
・日時のクラス例 LocalDateTime
・日時のフォーマットだけ管理するクラス
DateTimeFomatter
・いずれもimportが必要。
・日時インスタンスは書き換え不可(イミュータブル)。最初のインスタンスの中身が保持される。