🏗️ Java 技術スタック#
- プログラムの基礎
- オブジェクト指向
- 配列
- 例外処理
- 一般的な API
- コレクション + マップ
- 入出力ストリーム
- マルチスレッド
- ネットワークプログラミング
- 正規表現
- ラムダ式 + 関数型インターフェース
- リフレクション
- GUI
📌 Java の方向#
- JavaSE
- JavaME
- JavaWEB
- JavaEE
🔰 Java の特徴#
- マルチスレッド
- クロスプラットフォーム
- オブジェクト指向
- 自動ガベージコレクション
Java は静的な強力な型のインタープリテーション言語です。
静的型 変数を作成するときにデータ型を指定します。
動的型 変数を作成するときにデータ型を指定せず、実行後に値を割り当てるときにデータ型が確定します。
強力な型 型の強制変換が必要です。
弱い型 プログラムの文脈に基づいてデータ型が自動的に変更されます。
コンパイル型 コンパイラを使用して実行されるプログラミング言語です。
インタープリタ型 インタープリタを使用して実行されるプログラミング言語です。
xxx.java ----->xxx.class ----->Hello World
Windows/Linux/MacOS
- 実行: JVM が起動し、実行するクラスを静的領域にロードします。
- ロードが完了すると、JVM は自動的にそのクラスの main メソッドを呼び出します(メソッド呼び出しはスタックメモリ内でスタックフレームを作成してプッシュするため、メソッド呼び出しはスタックメモリ内でスタックフレームを作成してプッシュします)。
- main メソッド内で他のメソッドを呼び出す場合、
- 呼び出されるメソッドが他のクラスのメソッドである場合、対応するクラスを静的領域にロードし、スタックメモリ内でスタックフレームを作成します。
- 呼び出されるメソッドが現在のクラスのメソッドである場合、スタックメモリ内でスタックフレームを直接作成します。
- 呼び出されるメソッド内でさらに他のメソッドを呼び出す場合、スタックを続けてプッシュし、スタックのトップ要素が実行が完了するまで続けます。その後、ポップして前のスタックに戻り、実行を続けます。
- 最後に、main スタックフレームがポップされると、プログラム全体のライフサイクルが終了します。
💾 構造#
メモリストレージ#
ビット(bit) 8 ビット 1 バイト
最上位ビットは符号ビットです。
メモリの分割#
静的領域 / メソッド領域#
静的リソースファイルを保存します。例えば、静的変数、メソッド、実行時のクラスファイルなど。
VM スタック#
スタックデータ構造をモデル化した空間です。
主にメソッドの実行に使用されます。
構造的特徴 後入れ先出し
- スタックトップ 要素が最後に追加された場所
- スタックボトム 最初に追加された要素
- スタックフレーム スタックデータ構造内の要素
プッシュ スタックフレームをスタック空間に追加するプロセス
ポップ スタックフレームをスタック空間から削除するプロセス
メソッドを呼び出すたびに、そのメソッドはスタックメモリ内にスタックを作成し、スタック空間にプッシュされます。実行が開始され、メソッドの実行が完了すると、スタックがポップされ、スタックが破棄されます。
ヒープメモリ#
クラスオブジェクトとメンバ変数およびメンバメソッドを保存します。
🧾 データ型#
基本データ型#
- 数値型
- 整数型
- byte 8 ビット
- short 16 ビット
- int 32 ビット
- long 64 ビット
- 浮動小数点型
- float 32 ビット
- double 64 ビット
- 整数型
- ブール型 boolean
- 文字型 char
注意 ⚠️
- byte
値の範囲は127
~-128
- short
値の範囲は32767
~-32768
- int
値の範囲は2147483647
~-2147483648
- long
L
またはl
で終わる必要があります - float
F
またはf
で終わる必要があります
float は科学的な表記法を使用して格納されるため、float の 32 ビットの格納量は long の 64 ビットよりもはるかに大きいです。 - double
D
またはd
で終わるか、書かない場合 - boolean
true
またはfalse
のみ - char
シングルクォートで表され、1 文字のみ含まれます。
char の範囲は0
~65535
で、負の数は必要ありません。
Unicode エンコーディングをサポートしています。4 ビットの 16 進数整数値0
~f
\u0000
~\uffff
参照データ型#
- クラス
- 配列
- インターフェース
文字列#
\
エスケープ文字
+
文字列連結演算子
💱 型変換#
ブール型は変換できません。
- 低精度から高精度への自動型変換が可能です。
- 高精度から低精度への変換には強制的な型変換が必要です。
自動型変換#
byte --> short --> int --> long --> float --> double
char --> int --> long --> float --> double
強制的な型変換#
余分な上位ビットは切り捨てられ、精度が失われる可能性があります。
整数を char に変換する場合、符号ビットを考慮しない場合、対応するのは 65271
です。
整数を char に変換する場合、負の数を無視し、対応する負の数の 2 進数を対応する正の数に変換してから ASCII コードと照合します。
複数の型の混合演算#
複数の型の混合演算の場合、結果は演算に参加する最大の型になります。
混合演算の型には byte、short、int、char の 4 つの型が含まれる場合、いずれかまたは複数の型で演算を行うと、結果は int 型になります(混合演算の結果は演算に参加する最大の型と考えることができますが、最低でも int 型です)。
💬 コメント#
単一行コメント
// XXX
複数行コメント
/*
* XXX
* YYY
*/
/**
* XXX
* YYY
*/
Javadoc ドキュメントを生成できます。
📛 命名#
強制ルール 大文字と小文字のアルファベット、$
、_
、数字(数字で始めることはできません)、キーワードと予約語を使用できません。
任意のルール キャメルケース 要意を見て判断します。
💩 変数#
グローバル変数#
一般的には、二次参照なしで直接呼び出すことができる変数を指します。
Java にはグローバル変数は存在しません。
変数宣言#
データ型でメモリ空間を分割し、その空間に名前を付けて値を割り当てます。
変数の分類#
4 つのカテゴリに分けられます。
- ローカル変数 メソッド内に書かれた変数
初期値がない場合、初期化が必要です。 - スタティック変数 クラス本体にある
static
で修飾された変数 - メンバ変数 クラス本体にある
static
で修飾されていない変数 ヒープメモリに保存されます。 - 定数
static
とfinal
の両方で修飾された変数
デフォルト値#
- 整数
0
- 小数
0.0
- 文字
\u0000
- ブール
false
- 参照
null
スコープ#
スタティック変数の呼び出しは、クラス名。スタティック変数名を使用し、アクセス修飾子を考慮する必要があります。
区別#
同じ名前のローカル変数とスタティック変数をクラス名で区別します。
同じ名前のローカル変数とメンバ変数をthis
で区別します。
優先順位#
ローカル変数はスタティック変数 / メンバ変数と同じ名前にすることができます。
スタティック変数とメンバ変数は同じ名前にすることはできません。
📐 演算子#
算術演算子#
関係演算子#
>
>=
<
<=
==
!=
の結果はブール型です。
==
基本型の比較は値です。参照型の比較はメモリアドレスです。
論理演算子#
&
&&
論理積
論理積をサポートします。両方の側が数字であれば、論理積を実行できます。
2 つの数を 2 進数に変換して、各ビットを比較します。同じ場合は 1 を取り、そうでない場合は 0 を取ります。結果は 2 つの数の最小値以下になります。|
||
論理和!
否定^
排他的論理和 両方が異なる場合に真です。
2 つの数が数字である場合、2 進数の各ビットを比較します。異なる場合は 1 を取り、同じ場合は 0 を取ります。>>
右シフト演算子
右に 1 回シフトすると、その数は 2 で割られます(符号ビットは変わりません)。>>>
符号ビットを考慮せず、正負を考慮せず、最左端に 0 を追加します。負の数は正の数になる場合があります。<<
左シフト演算子
左に 1 回シフトすると、左側(符号ビット以外)が削除され、右側に 0 が追加されます。その結果、その数は 2 倍になります。
代入演算子#
+=
-=
*=
/=
%=
など
計算中に自動的に強制的な型変換が行われます。
代入演算子は右結合であり、同じ優先順位の場合は右から左に計算されます。
int result = x = y = z = 10;
=
の右結合性により、まず z = 10
を実行し、次に y = z
を実行し、最後に x = y
を実行します。