個人メモ用
1章.Javaクラス設計
-
switch
-
扱えないデータ型
- double,Double,long,Long
-
ラッパークラス使用時注意
- 初期値はnullなので、そのまましようとするとヌルポで落ちる。
-
文字列での分岐
- Stringの
hashCode()
とequals()
の順で比較される。
- 大文字小文字は区別される。
- Stringの
-
public class Sample {
static int num1;
static Integer num2;
public static void main(String arg[]) {
// 基本データ型は初期化されるので0になる
switch (num1) {
case 0:
System.out.println(0);
break;
default:
System.out.println(1);
break;
}
// ヌルポで落ちる
switch (num2) {
case 0:
System.out.println(0);
break;
default:
System.out.println(1);
break;
}
}
}
// 結果
[skanehira@MacBook java]$ java Sample
0
Exception in thread "main" java.lang.NullPointerException
at Sample.main(Sample.java:17)
[skanehira@MacBook java]$
-
拡張されたリテラル
-
_(アンダースコア)がある整数リテラル
- 先頭及び末尾、記号の前後は利用できない。
-
-
アクセス装飾子とカプセル化
-
カプセル化
- メンバ変数にprivate、GetterとSetterにpublicをつけることで、
メソッドを通してしかデータにアクセスできないようにする。
- メンバ変数にprivate、GetterとSetterにpublicをつけることで、
protectedとprivateはメソッドのみ使用できる
アクセス範囲(下表)
-
アクセス装飾子 | 意味 |
---|---|
public | どこからもアクセス可能 |
protected | 同一パッケージか継承したクラスからのみアクセス可能 |
指定なし | 同一パッケージからのみアクセス可能 |
private | クラス内からのみアクセス可能 |
-
finalとstatic装飾子
-
staticメンバの呼び出し方
- クラス名.staticメンバ
- 変数名.staticメンバ
- クラス名.staticメンバ
-
インスタンスとstaticメンバのクラス内の直接アクセス
- static → instance はNG
- instance → static はOK
- static → instance はNG
final装飾子
-
適用箇所 | 意味 |
---|---|
変数 | 定数になる |
メソッド | オーバーライドできなくなる |
クラス | 継承できなくなる |
-
イニシャライザブロック
-
staticイニシャライザ
- クラスがロードされる時に一度だけ実行されるブロック。
-
イニシャライザ
- インスタンス化する時に、コンストラクタが呼ばれる前に実行されるブロック。
-
実行の順番
- staticイニシャライザ→イニシャライザ→コンストラクタ。
-
public class Sample {
public static void main(String arg[]) {
new Init();
}
}
class Init {
// staticイニシャライザ
static {
System.out.println("static initializer");
}
// イニシャライザ
{
System.out.println("initializer");
}
// コンストラクタ
Init() {
System.out.println("construct");
}
}
// 実行結果
[skanehira@MacBook java]$ java Sample
static initializer
initializer
construct
-
列挙型
-
Enum
- enumを定義した場合、java.lang.Enumクラスを継承したfinalクラスになるため継承できない。
- 定義した変数は自動的に
public static final
がついてクラス定数になる。
- newによるインスタンス化はできない。
- インターフェイスを実装できる。
- Comparableインターフェイスを実装しているため、定義した変数の順番は保証される。
- enumを定義した場合、java.lang.Enumクラスを継承したfinalクラスになるため継承できない。
-
列挙型でのコンストラクタ・変数・メソッド定義
-
public class Sample {
public static void main(String arg[]) {
// toString(): 定数名が返却される
System.out.println(Status.ACTIVE);
System.out.println(Status.STOP);
// 定義したメソッド
System.out.println(Status.ACTIVE.getNum());
// ordinal(): 定数の位置を返却
// 定義した順から0,1,2...
System.out.println(Status.ACTIVE.ordinal());
System.out.println(Status.STOP.ordinal());
// values(): 定義した定数一覧を取得
for (Status s : Status.values()) {
System.out.println(s);
}
// valueOf(): 定義した定数のオブジェクト取得
Status active = Status.valueOf("ACTIVE");
// name(): 定数名を取得
System.out.println(active.name());
}
}
enum Status {
// コンストラクタにintを渡して、Status型のObjectをnewしている
ACTIVE(0), STOP(1);
// 変数を定義
private int num;
// コンストラクタ
Status(int n) {
this.num = n;
}
// メソッド
public int getNum() {
return num;
}
}
// 結果
[skanehira@MacBook java]$ java Sample
ACTIVE
STOP
0
0
1
ACTIVE
STOP
ACTIVE
-
Objectクラス
-
toString()
- オーバーライドする時は
public
をつける(よく忘れる…)
- オーバーライドする時は
-
finalize()
- ガベージコレクタによってオブジェクトが破棄される前に実行される。
- 実施タイミングは指定できず、VMが適当にやってくれる。
- superのfinalize()は明示的に呼び出す必要がある。
- ガベージコレクタによってオブジェクトが破棄される前に実行される。
-
equals()とhashCode()
-
equals()
は同じオブジェクトかどうかを比較する
Stringクラスの場合は同じ文字かどうかを比較する - オーバーライド時のルールは以下。
equals()
がtrue時、hashCode()
は同じ値を返す
hashCode()
が異なる値の場合、equals()
はfalseを返す
equals()
がfalseでも、hashCode()
はどちらもでもOK。
-
-
-
staticインポート
- 構文
import static パッケージ名.クラス名.*;
import static パッケージ名.クラス名.staticメソッド;
import static パッケージ名.クラス名.static変数;
- 構文
import static java.lang.System.out;
public class Sample {
public static void main(String arg[]) {
out.println("import static");
}
}
// 結果
[skanehira@MacBook java]$ java Sample
import static
ポリモフィズム
-
継承
-
オーバーライドと隠蔽
- オーバーライド
- アクセス装飾子は親クラスと同等か、それ以上広くなければいけない。
- 戻り値、メソッド名、引数の数、順番は完全一致でなければいけない。
- アクセス装飾子は親クラスと同等か、それ以上広くなければいけない。
- 隠蔽
- staticメンバーをオーバーライドした時、変数の型によってアクセス先が決まる。
- 非staticメンバーは、インスタンスの型によって、アクセス先が決まる。
- staticメンバーをオーバーライドした時、変数の型によってアクセス先が決まる。
- オーバーライド
-
可変長引数
- 構文は
データ型...
である。
- 引数リストの最後尾に定義しなければいけない。
- 1つしか定義できない。
- 引数を渡さない場合は空の配列になる。
- nullを渡した場合は、
string
もしくは[]string
にキャストしないと警告がでる。 - 引数リストを明示的に定義したメソッドが優先的に呼ばれる。
- 構文は
-
可変長引数とオーバーロード
- オーバーロード時引数は以下の優先順位で判定される。
完全一致 → 暗黙の型変換 → AutoBoxing → 可変長変数
- オーバーロード時引数は以下の優先順位で判定される。
-
thisとsuper
- コンストラクタが定義されていない場合、コンパイル時に引数なしのコンストラクタが定義される。
- コンストラクタが定義されている場合、コンパイル時に引数なしのコンストラクタを定義されない。
- サブクラスのコンストラクタに
super()
もしくはsuper(引数あり)
がない場合は、
コンパイル時に引数なしのsuper()
が定義される。
-
this
とsuper
はコンストラクタの先頭に定義しなければいけない。
- コンストラクタが定義されていない場合、コンパイル時に引数なしのコンストラクタが定義される。
-
-
抽象クラス
-
抽象クラスとは
- abstractをつけたクラスのこと。
- 抽象メソッド(abstractをつける)と具象メソッド(実装あり)を定義することができる。
- インスタンス化できない。
-
抽象クラスの継承クラス
- 抽象メソッドはオーバーライドしなければいけない。
- 抽象クラス同士の継承はできる、その際抽象メソッドのオーバーライドはしなくて良い。
- すべての抽象メソッドを実装する必要がある。
-
抽象クラスのstaticメンバ定義
- 抽象クラスに定義したインスタンスメンバは、実装した抽象メソッドから呼び出すようにする必要がある。
- staticメソッドは、他同様
クラス名.staticメンバ
で呼び出せる。
-
-
インターフェイス
-
インターフェイスとは
- 抽象メソッドとstatic変数のみを定義できる。
- publicなstatic変数を定義できる。
- サブインターフェイスを定義できる。
-
定数とメソッド
- static変数は強制的に
public static final
がつくので、宣言時に初期化する必要がある。 - メソッドは強制的に
public abstract
がつくので、オーバーライド時はpublic
を必要がある。
- static変数は強制的に
-
実装クラス
- extendsとimplementsを同時に使用できるが、extendsを先に書く必要がある。
-
継承
- 多重継承(
subIF extends XIF, YIF{}
)と多重実装(class A implements XIF, YIF{}
)ができる
- 多重継承(
-
-
型変換
-
基本データ型の型変換ルール
- 暗黙
-
byte
→char or short
→int
→long
→float
→double
-
- キャスト
- 暗黙型変換とは逆順
- 注意
- データサイズが型に収まれば、
byte,short,char
型にそのまま代入できる。 - 演算子で計算する場合、片方Aがdouble,float,long,intの場合は、
片方Bがそれよりも小さいデータ型であれば、片方Aのデータ型に変換される。
- データサイズが型に収まれば、
- 暗黙
-
参照型の型変換ルール
- 暗黙
- サブクラスのインスタンスをスーバークラスの変数で扱える。
- キャスト
- サブクラスのインスタンスをスーパークラスの型に変換できる。
- 逆はできない。(スーパークラスはサブクラスを含んでいないから)
- 注意
- 継承関係にないクラスは型変換できない。
- 暗黙
-
ネストクラス
-
ネストクラス
-
とは
- クラス中で定義するクラスのこと。
- 外側クラスのメンバの一つであるため、アクセス修飾子、abstract、finalを使用できる。
- staticと非staticネストクラスがある。非staticクラスはインナークラスと呼ぶ。
-
ルール
- 外側クラスの同じ名前は使用できない。
- アクセス修飾子、abstract、finalを使用できる。
- staticクラスは非staticメンバとstaticメンバを持つことができる。
外側クラスのインスタンス変数にアクセスできない。 - インナークラスは、staticメンバを持つことができない。 外側クラスのインスタンス変数にアクセスできる。
-
定義とコンパイル
- ネストクラスもコンパイルされるので、生成されるクラスファイルは
外側クラス名$ネストクラス名.class
になる。
- ネストクラスもコンパイルされるので、生成されるクラスファイルは
-
ネストクラスへのアクセス
外側クラス.非staticクラス名 変数名 = new 外側クラス().new 非staticクラス名();
外側クラス.staticクラス名 変数名 = new 外側クラス.staticクラス名()
- メソッド内でネストクラスを使用するときは
new 非staticクラス名().methodA()
staticクラス名.methodB()
ornew staticクラス().methodB()
-
ネストクラスの応用
- ネストクラスはinterfaceを実装、抽象クラスを継承することができる。 ルールは同じ。
-
-
ローカルクラス
-
とは
- メソッド内で定義するクラスのこと。
-
ルール
- 非staticクラスのみ定義できる。
- アクセス修飾子は使用できない。
- abstract、finalは使用できる。
- 外側クラスのインスタンス変数にアクセスできる。
- 外側クラスのメソッドの引数とローカル変数のうち、final指定されたものだけアクセスできる。
-
-
匿名クラス
-
とは
- メソッド内でクラス名を指定せず、
クラス宣言とインスタンス化を一つの式で定義できるクラスのこと。
式として定義するので、最後に;
が必要。
- メソッド内でクラス名を指定せず、
-
ルール
- 非staticクラスのみを定義できる。
- アクセス修飾子は使用できない。
- abstract,finalを使用できない。
- 外側クラスのインスタンス変数にアクセスできる。
- 外側クラスのメソッドの引数とローカル変数のうち、final指定されたものだけアクセスできる。
- コンストラクタを定義できない。
-
オブジェクト指向の設計
-
is-a関係
- 継承関係の事を指す。
犬も猫も人間も動物であると同じ理屈。
- 継承関係の事を指す。
-
has-a関係
- 別クラスの機能を持っていること。
車はタイヤ、ハンドルを持っていると同じ理屈。
- 別クラスの機能を持っていること。
-
凝集度と結合度
-
凝集度
クラスの役割分割の適切度合いを指す。
凝集度が高い場合は、 クラス間のメソッドや変数の関連が強く、
仕様変更が生じたときに影響範囲が大きい。 -
結合度
クラス間の依存度合いを指す。
依存度合いが低いことを疎結合という。
度合いが低いことが望ましい。
合っているかはわからないけど、例えば車はタイヤがないと動かないのは結合度が高い。
DVDプライヤーがなくても車は動くのは結合度が低い。
-
-
コンポジション
- 集約の中で特に強い関係をコンポジションと言う。(↑車の例)
全体クラスと部分クラスの生存期間が同じ。
- 集約の中で特に強い関係をコンポジションと言う。(↑車の例)
-
パターン
-
シングルトーン
一つしかオブジェクトを生成しないパターン。private
コンストラクタを作成し、
private static final
変数にインスタンスを保持し、
インスタンスを返すpublic
メソッドを用意することで実現できる。 -
DAO
- 永続化オブジェクトとアプリケーションロジック(DB接続(ファイルを開く)、CRUD)を分けるパターン。
-
ファクトリ
- インスタンスを生成する役割を持つクラスを作るパターン。
java標準APIだと各ラッパークラスの
valueOf()
がこれに当たる。
- インスタンスを生成する役割を持つクラスを作るパターン。
java標準APIだと各ラッパークラスの
-
Java API
-
StringBuilderとStringBufferの違い
-
とは
- 一度生成した文字列に対して、操作を行うことができる。
要はメモリ上にデータをいじることができるから、複製しないということ。
str1.append(str2)`しても参照先は変わらず、str2がstr1に追記される感じ。
- 一度生成した文字列に対して、操作を行うことができる。
-
違い
-
StringBuilder
はスレッドセーフではない、StringBuffer
はスレッドセーフ。
それ以外はほぼ同じ。
-
-
equalsメソッド
- Objectのequalsをオーバーライドしていないので、参照先比較になる。
equals
をオーバーライドしているのはString
やラッパークラス(Integerなど)
- Objectのequalsをオーバーライドしていないので、参照先比較になる。
その他のメソッド
-
コンストラクタ | 説明 |
---|---|
StringBuffer() | 16文字の容量を持つStringBufferを構築 |
StringBuffer(int capacyty) | 指定した容量のStringBufferを構築 |
StringBuffer(String str) | 指定した文字で初期化されたStringBufferを構築 |
メソッド | 説明 |
---|---|
StringBuffer append(String str) | 末尾に指定した文字列を追加する |
StringBuffer insert(int offset, String str) | offset-1の位置に指定した文字列を挿入 |
StringBuffer reverse() | 文字列をリバースする(abcならcba) |
void setCharAt(int index, char ch) | indexの文字を指定した文字に置換 |
StringBuffer replace(int start, int end, String str) | startからend-1までの文字を指定した文字に置換 |
String subString(int start, int end) | startからend-1までの文字を指定した文字列を返却 |
String subString(int start) | startから末尾までの文字列を返却 |
StringBuffer delete(int start, int end) | startからend-1までの文字列を削除 |
-
ラッパークラス
-
とは
- 基本データ型を操作するためのクラス。
数値を文字列に変換したり、その逆も行いたい時に使うと便利。
- 基本データ型を操作するためのクラス。
-
メソッド
-
ValueOf()
基本データ型をラッパークラスに変換するstaticメソッド -
parseXXX
文字列を基本データ型に変換するstaticメソッド -
ValueXXX
ラッパークラスを基本データ型に変換するメソッド
-
-
- AutoBoxingとUnboxing
- ロケール
-
リソースバンドル
とは
ListResourceBundleクラスの使用
リソースバンドルとその使用クラスの実装①
リソースバンドルとその使用クラスの実装②
PropertyResourceBundleクラスの使用
リソースバンドルの検索
ResourceBundle.Controlクラス
-
フォーマット
NumberFormat
DecimalFormat
DateFormat
SimpleDateFormat
-
正規表現
とは
メタ文字
java.util.regex
-
コレクション
とは
種類と特徴
List,Set,Queue,Map
Listインターフェイスの実装
Setインターフェイスの実装
イテレータ
Queue実装
Mapインターフェイスの実装
-
ジェネリックス
とは
ダイアモンド演算子
クラス定義
メソッド定義
インターフェイス宣言
継承を使用したジェネリックス
ワイルドカードを使用したジェネリックス
-
オブジェクトの順序付け
-
ComparebleインターフェイスとComparatorインターフェイス
Comparable
Comparator
配列とリストのソートと検索
Arraysクラス
-
例外処理
-
例外クラス
checked
unchecked
独自例外クラス
-
try-catch-finally
各ブロックの役割
複数ブロックキャッチ
マルチキャッチ
-
throwとthrows
throw
throws
rethrows
オーバーライド時注意
- try-with-resources
- Throwableクラスの機能拡張
- アサーション
入出力
- File
- FileInputStream
- FiltOutputStream
- DataInputStream
- DataOutputStream
- FileReader
- FileWriter
- BufferdReader
- BufferdWriter
- System定数
- シリアライズ
- ObjectInputStream
- ObjectOutputStream
- シリアライズの継承
- Console
-
ストリームの書式化および解析
ストリームの書式化
ストリームの解析
NIO.2
-
パッケージ
java.nio.file
java.nio.file.attribute
java.nio.channels
- Pathインターフェイス
- Files
- ランダムアクセスファイル
-
ディレクトリ操作
ディレクトリへのアクセス
ファイルツリーの探索
ファイルの探索
変更と監視
JDBC
-
パッケージ
java.sql
javax.sql
javax.sql.rowset
- JDBCドライバ
- 例外
-
SQLステートメントの実行
ステートメントインターフェイス
問い合わせ
挿入
削除
- PreparedStatementインターフェイス
- CallbackStatementインターフェイス
- 高度なデータ型
-
メタデータ
ResultSetMetaDataインターフェイス
-
ResultSetの拡張
問い合わせ結果のスクロール、絶対/相対位置指定
ResultSetオブジェクト上でのデータ挿入・更新
-
トランザクション
制御
トランザクション分離レベル
-
RowSet関連のコンポーネント
RowSetインターフェイス
-
RowSet実装タイプ
Connected RowSet
Disconnected RowSet
スレッドと並行処理
-
スレッド
- 作成と開始
- 状態
- 優先度
- 制御
- 排他制御と同期制御
- 排他制御
- 同期制御
- デッドロックとスレッドスターベーション
-
並行コレクション
- パッケージ
- Queueインターフェイスの拡張
- Mapインターフェイスの拡張
- ArrayListとSetインターフェイスの拡張
- Executorフレームワーク
- スレッドプール
- ScheduleThreadPoolExecutorクラス
- Callableインターフェイス
- アトミックとロック
- java.util.concurrent.atomicパッケージ
- java.utii.concurrent.locksパッケージ
- Fork/Joinフレームワーク