oracleJavaSilverの勉強日記(Java APIの主要なクラスの操作)
String
複数の文字を集めたものを「文字列」と呼ぶ。Stringクラスは、ほかのクラスと同様にインスタンスを生成して利用する。Stringクラスのインスタンスを生成するにはいくつかの方法があるが、代表的なの次の二通り。
・newを使ってインスタンス化する
・ダブルクォーテーション「"」で括った文字列リテラルを記述する
Stringは「immutable(不変)オブジェクト」。
オブジェクト
オブジェクトは、何らかのデータを内部に持っている。このとき、一度セットしたフィールドの値を、あとから変更できるオブジェクトと変更できないオブジェクトがある。
変更できるオブジェクトのことを「mutable(可変)オブジェクト」、変更できるオブジェクトのことを「immutable(不変)オブジェクト」と呼ぶ。
Stringクラスの基本メソッド
replaceAllメソッド
置換した結果の文字列を持った新しいStringインスタンスを作り、そのインスタンスへの参照を戻すもの
charAtメソッド
インスタンスが保治している文字列から、引数で指定された位置にある1文字だけを抜き出して戻す。
indexOfメソッド
引数で指定された文字が文字列のどの位置に存在するかを調べるためのメソッド。もし、存在しなければ、-1が戻される。
substringメソッド
文字列から任意の文字列を抽出するメソッド。
trimメソッド
文字列の前後にある空白を除去するためのメソッド。文字列内の空白を除去するわけではない。trimメソッドが除去する空白は色々あるが、次の3つを覚えておく。
・スペース
・¥tまたはタブ文字
・¥nまたは¥rまたは改行
replaceメソッド
文字列を置き換えるためのメソッド。文字列の置き換えは先頭から始まり、文字列の最後まで行われる。replaceメソッドが引数は、char型かCharSequence型のうちのどちらかしか受け取らない。
lengthメソッド
文字数を戻すメソッド。半角英数字も全角文字も同じように文字列を戻す。半角文字・全角文字のいずれかも1文字として扱う。
startsWithメソッド
文字列が引数で指定された文字で始めるかどうかを調べるためのメソッド。調べた結果は真偽値を戻す。
endWithメソッド
引数の文字で終わっているかどうかを調べるためのメソッド。調べた結果は真偽値で戻す。
メソッドチェイン
メソッドの戻り値に対してさらにメソッドを呼び出すように記述する方法。
splitメソッド
文字列を分割するためのメソッド。分割する箇所は、正規表現で指定する。
concatメソッド
オブジェクト内部の文字列と引数として渡された文字列を連結した、新しい文字列を戻すメソッド。+演算子による文字列連結と同じ効果ととらえていい。
+演算子
+演算子は、数値を加算するための演算子だが、文字列に対して使えば、左右のオペランドの文字列は連結される。数値と文字列の場合は、数値が文字列に置き換わってから文字列として連結される。また、数値加算と文字列連結が混在する式は、左から順に実行する。
※参照を持たないことを示すnullは”null”という文字列に置き換えられ、文字列として連結する。
StringBuilderクラス
内部にバッファを持った文字列を扱うためのクラス。
StringBuilderは保持している文字列+余分のバッファを持っている。余分のバッファはデフォルトで16文字分のバッファを持っている。
※文字列を引数に渡すコンストラクタを使った場合、StringBuilderのインスタンスは、「文字列の長さ+16文字分」のバッファを持っている。
※コンストラクタでバッファの値を指定することもできる。その時は、16文字は計算しない。
StringBuilderのメソッド
appendメソッド
文字列に新しい文字列を追加するメソッド。追加された文字列は、既存の文字列の後ろに追加される。appendメソッドには様々な引数を受け取ることができる。
・プリミティブ型(整数、浮動小数点数、真偽、文字の8種類すべて)
・String
・char配列
・オブジェクト
insertメソッド
文字列を任意の場所に挿入するメソッド。このメソッドは2つの引数を取り、第1引数は挿入する場所を、第2引数は挿入する文字列を受け取る。
deleteメソッド
引数で指定した範囲にある文字列を削除するためのメソッド。
deleteCharAtメソッド
引数で指定した位置にある文字を削除するメソッド。
reverseメソッド
文字列を反転するメソッド。
replaceメソッド
第1引数と第2引数で指定した範囲の文字列を、第3引数の文字列に置き換えるメソッド。
subSequenceメソッド・substringメソッド
両方とも任意の範囲の文字列を抽出する。
ラムダ式
関数型インターフェース
ラムダ式を使う前に「実装が必要なメソッドを1つだけもついインターフェース」を生成する必要がある。それが関数型インターフェース。
ラムダ式の構文
関数型インターフェースの型 変数名= (引数) ->{処理};
引数の宣言では()を省略することができる。もし、引数のカッコを省略するのであれば、引数の型を記述してはいけない。また、引数が2つの場合は引数の()を省略することはできない。
ラムダ式ではインターフェースの中の変数名と同じにする必要はない。だた、ラムダ式で使う変数は全部同じにしなければいけない。また、実行したい処理が1つしかないのであれば、{}を省略することもできる。
戻り値が存在した場合
・{}省略→returnキーワードを記述できない
・{}あり→returnキーワードを記述しなければコンパイルエラー
※メソッド内で宣言したローカル変数と同じ名前の変数をラムダ式の引数名として使うことはできない。
※ラムダ式外で宣言されたローカル変数にラムダ式内からアクセスするには、実質的にfinalな変数(定数)でなければいけない。
java.util.funtionパッケージ
Predicate
何らかの処理の結果としてboolean型の値を返すための関数型インターフェース。
※他にも3つほどあるが、SilverではPredicateインターフェースしかでない。
日付と時刻に関するAPI
LocalDate
・immutable(不変)オブジェクト
・月の始まりが1から始まる。
・日付を操作するための便利なメソッドがある。
ofメソッド
日付を指定してインスタンスを生成したい場合。
nowメソッド
現在の日付でインスタンスを生成したい場合。
parseメソッド
文字列の日付をLocalDateクラスに変換する場合。
until
日付の差を計算するメソッド。
LocalTime
・immutable(不変オブジェクト)
・24時間で時間を扱い、午前/午後の区別をしない。
plusHoursメソッド
時間を追加するメソッド。
※LocalDateで書いた3つのメソッドも使える。
Duration
時刻の差を扱うためのクラス。
between
2つの日時の差を計算し、その結果をDurationのインスタンスとして戻すメソッド。
toHours
時間の差を取り出すメソッド。
LocalDateTime
LocalDateとLocalTimeの両方の特徴を持ち、日付と時刻の両方を扱えるクラス。
Period
日付の差を扱うクラス。
plusDays
日付を追加するメソッド
minus
日付を変更するメソッド。
DateTimeFormatter
フォーマッター
BASIC_ISO_DATE
日付の区切り記号がない年月日を表す書式
例:20220831
ISO_DATE_TIME
区切り記号や時刻情報を付けた書式
例:2022-08-31T00:00:00
ArrayList
このクラスは「動的配列」と呼ばれ、配列のように使える。いくつかの特徴がある。
・オブジェクトであればどのような型でも扱える
・必要に応じて要素数を自動的に増やす
・追加した順に並ぶ
・nullも値として追加できる
・重複した値を追加できる
・スレッドセーフではない。
遅くても安全に並行処理ができるクラスが「スレッドセーフなクラス」
安全に並行処理はできないけど早い単一処理専用のクラスが「スレッドセーフではないクラス」
addメソッド
値を追加するメソッド
setメソッド
値を置き換えるメソッド
removeメソッド
リストから要素を削除するメソッド。削除する対象の要素が複数ある場合は、equalsメソッドがtrueを戻す(同値)最初の1つを削除する。
※値を削除した場合、後ろの要素が繰り上がる。
getメソッド
値を取り出すメソッド
removeIfメソッド
引数で渡されたラムダ式がtrueを戻せば、コレクション内の要素を削除するメソッド。
※コレクションはmutable。対象となるコレクションから要素を直接削除する。
oracleJavaSilverの勉強日記(例外の処理)
例外
例外は、プログラム実行中に発生する何らかの「トラブル」を指す。トラブルは、プログラマーの不注意で作りこむバグだけではなく、要件や仕様の間違い、実行マシンの不具合などたくさんある。
例外処理
トラブルが発生した時に「どのように対処すべきか」を記述した処理。
try-catch-finally文
例外が発生する可能性がある処理をtryブロックで括り、例外が発生した時の処理をtryブロックに続くcatchブロックに記述する。例外発生の有無にかかわらず必ず実行したい処理をfinallyブロックに記述する。
構文
try{
例外が発生する可能性がある処理
} catch(例外クラス型 変数){
例外が発生した時の処理
}finally{
例外発生の有無にかかわらず実行したい処理
}
※上の順番を崩してはいけない
※throwは意図的に例外を起こして例外処理を行われること
tryブロック・finallyブロック
1つしか記述できない。
catchブロック
複数のcatchブロックを記述することは可能。
catchブロック内でreturnをしても、finallyブロックが実行されてからreturnする。
もし、catchブロックとfinallyブロックでもreturnしていた場合は、finallyブロックのreturnが上書きされる。
※returnで戻すときはretuen専用の変数があるイメージなので、変数の値が変わっても、returnでで戻ってくる値は変わんない。
検査例外と非検査例外
エラー(Error)
プログラムから直すことのできないトラブル。try catch や throws 宣言をしてもしなくてもいい。
例
OutOfMemoryError
インスタンスやクラスの定義情報を保存するためのヒープメモリが不足した場合にスローされる。
NoClassDefFoundError
実行対象のクラスファイルが見つからなかった場合スローされる。
StackOverflowError
メソッドの実行に必要な情報はメモリのスタック領域に配置される。そのスタック領域が足りなくなった場合にスローされる。
AssertionError
アサーションの条件式に合致しないものがあったときにスローされる。
VirtualMachineError
OutOfMemoryErrorやStackOverflowError、InternalErrorの親クラスで、JVMが壊れているか、動作を継続するために必要なリソースが足りなくなったことを示すためのスロー。
InternalError
JVM内で何らかの内部エラーが発生したこと。
例外(Exception)
プログラムが対処できるトラブル。検査例外と非検査例外の2種類ある。Javaの例外は基本的に検査例外。
検査例外(Exception)
検査例外は例外処理を記述したかどうかをコンパイラ検査を行う例外。基本的に正しいプログラムを書いても避けきれない例外。そのため、try-catch文を書かなければいけない。もしくはthorws句を書く。
RuntimeExceptionおよびそのサブクラス以外のクラス
例
SampleException
非検査例外(RuntimeException)
非検査例外は例外処理を記述したかどうかをコンパイラが検査しない例外。正しいプログラムを書けば回避することができる。そのため、try-catch文を書かなくても書いてもいい。
例
TestException
ArrayindexOutOfBoundException
配列の要素外アクセス
NullPointerException
nullに対してメソッドを呼び出すようなコードを記述した場合。
IndexOutOfBoundsException
配列や文字列、コレクションの範囲外アクセス
StringIndexOutOfBoundException
文字列の範囲外アクセス
ClassCastException
継承関係や実現関係にないクラスをキャストしようとする。
IllegalArgumentException
オブジェクトを利用する再の事前条件を守らなかったこと。
IllegalStateException
準備が終わっていないなど
NunberFormatException
文字列を数値に型変換する時になる。
Staticイニシャライザ
クラスを利用する時に一度だけ呼び出される初期化ブロック。Staticイニシャライザを利用することで、static変数の初期化が可能になる。もし、Staticイニシャライザを処理している時に何らかのトラブルが発生したらExceptionInInitializerErrorが発生する。
oracleJavaSilverの勉強日記(継承の操作)
継承
あるクラスを機能拡張した新しいクラスを定義すること。拡張元になるクラスのことをスーパークラス。拡張したクラスのことをサブクラスと呼ぶ。
継承をすることで、サブクラスはスーパークラスの特徴を引き継ぐ。サブクラスのインスタンスは、スーパークラスのインスタンスと差分のインスタンスの両方で構成されている。
継承するにはextendsを使う。
下の二つはサブクラスに引き継がない
・コンストラクタ
・privateなフィールドやメソッド
デフォルトは「パッケージアクセス」と呼ばれ、同じパッケージに属するクラスのインスタンスからのアクセスを許可するものです。たとえ継承関係にあっても、スーパークラスとサブクラスのそれぞれが属するパッケージが異なれば、アクセスできない。
protectedは異なるパッケージであっても継承関係にあればアクセスできる。
※多重継承をすることはできない。
インターフェース
特徴
・メソッドはpublicしか持てない。省略しても自動的にpublicになる。
・多重実現をすることができる。その場合はカンマ区切りで列挙する。
・抽象メソッドしか書くことしかできない。
・フィールドは二つのルールを満たせばつかえる。
finalを使って、定数にする。
staticと使って、インスタンスが生成できなくても使える。
インターフェースを実現するにはimplementsを使う。
抽象クラス
インターフェースとクラスの両方の性質を持ったクラス。つまり、実装を持つ具象メソッドと実装を持たない抽象メソッドの両方を持つことができる。また、フィールドも定義できる。
抽象クラスはインターフェースと同じでインスタンス化できない。
オーバーライド
サブクラスでスーパークラスに定義されたメソッドを「再定義」すること。
オーバーライドをするにはいくつかのルールがある。
・メソッドのシグニチャ(メソッド名、引数リストの型、数、順番)が同じ。
・戻り値型が同じ型かサブクラス。
・アクセス修飾子が同じか、緩いもの。
サブクラスのインスタンスは、スーパークラスのインスタンスと差分のインスタンスで構成されている。そのため、同じ名前のフィールドがあった場合、2つのインスタンスには同名の異なるフィールドが存在することになる。こういう状態になったとき、どちらのフィールドが使われるかはルールが決まっている。
・フィールドを参照した場合には、変数の型で宣言された方を使う。
・メソッドを呼び出した場合には、メソッド内の指示に従う。
型変換
継承関係にある場合、サブクラスのインスタンスをスーパークラス型の変数で扱うことができる。このように、サブクラスをスーパークラス型に変換することを「アップキャスト」と呼ぶ。スーパークラス型で扱っていたインスタンスを、元の型に戻すことを「ダウンキャスト」と呼ぶ。
アップキャストはコンパイラが自動的に型変換(キャスト)してくれる。
ダウンキャストは明示的にキャスト式を書かなければいけない。キャスト式は、変換したい型をカッコ「()」内に記述する。
※型同士に互換性がない場合は、実行時に例外がスローされる。
スコープ
同じスコープ(有効範囲)内に同じ名前の変数を宣言することはできない。ただし、フィールド変数とローカル変数を同じ名前にすることはできる。なぜなら、「this.フィールド名」を使ってフィールド変数を呼び出すから。
フィールド変数とローカル変数を同じ名前で宣言した場合、ローカル変数が優先される
super();
サブクラスのインスタンスを作る時、スーパークラスのインスタンスを持つコンストラクタと、差分のインスタンスがもつコンストラクタがあった場合、先に実行しなければいけないのは、スーパークラスのインスタンスが持つコンストラクタ。
サブクラスのコンストラクタには、スーパークラスのコンストラクタを呼び出す「super();」がコンパイラによて先頭行に追加される。
oracleJavaSilverの勉強日記(メソッドとカプセル化の操作)
メソッドの定義
構文
アクセス修飾子 戻り値型 メソッド名(引数の型 引数名){メソッド内の処理}
戻り値型は、メソッドを実行した結果、どのような種類の結果データを戻すかを表したもの。戻り値型の宣言は必須。戻り値型を何も戻さない場合は、戻り値型をvoidにする
戻り値
メソッドが戻す戻り値を受け取るには、メソッドが定義する戻り値型と同じ型、もしくは互換性のある型の変数を宣言して、結果を代入しなければいけない。
引数
メソッドに宣言された引数は処理を実行するために必要なデータを意味する。そんため、宣言された引数はそのメソッドを呼び出す際に「渡されなければいけないデータ」と考える。
可変長引数
引数の数を自由に変更できる引数の事。引数の型の直後にピリオド3つ「...」を付けて宣言する。
例
void sample(int... num){}
渡された複数の値は、JVMによって配列に置き換えられる。そのため、可変長引数の値を使う時には、配列と同じように大かっこ「[]」を使う。
可変長引数を使う時の、注意点
・同じ型の数が可変な引数をまとめられるだけで、異なる型はまとめられない。
・可変長引数以外の引数を受け取る必要がる場合、可変長引数は最後の引数にすること
return文
値の呼び出し元のメソッドに戻す以外にも、呼び出し元に制御を戻すという意味もある
return文の後ろの処理は実行できない。もし、return文を実行したあとに何らかの処理をするようなコードを記述するとコンパイルエラーになる。
staticなフィールド
ロード後、staticで修飾されたフィールドやメソッドは、「static領域」と呼ばれる領域に配置される。それ以外の部分は、「ヒープ領域」と呼ばれる領域に配置される。
インスタンスが生成されるときには、ヒープ領域にあるクラス定義に従ってインスタンスが生成される。この仕組みがあるため、staticフィールドはインスタンスを作らなくても使えるという性質を持つ。
staticなフィールドにアクセスするには「クラス名.フィールド名」
インスタンスの生成後であれば「変数名.フィールド名」
staticなメンバのルール
staticなメンバとはstaticで修飾されたフィールドやメソッドのこと。
・staticなメソッドから、staticではないメンバにはアクセスができない。
・staticではないメソッドから、staticなメンバにアクセスすることは可能。
オーバーロード
メソッドの多重定義とも呼ばれ、同名のメソッドを複数宣言できる機能の事。ただし、名前が同じでも引数が異なることという条件が付く。
引数が異なるとは、引数の数や型、順番が異なることで、これらが異なれば同名のメソッドを複数定義できる。
メソッド名と引数のセットのことを「シグニチャ」と呼ぶ
※アクセス修飾子・引数名・戻り値の型・変数名を変えてもオーバーロードにならない
コンストラクタ
生成されたインスタンスが他のインスタンスから使われる前に、初期化するためメソッドの一種。自由に定義ができ、普通のメソッドと同じくオーバーロードすることができる。
コンストラクタには3つのルールがある。
・メソッド名をクラス名と同じにすること。
・戻り値型は記述できない
・newと一緒にしか使えない(インスタンス生成時以外は呼び出しができない)
・アクセス修飾子はすべて使える
コンストラクタが存在しない場合は、デフォルトコンストラクタが自動で追加される。
ただし、明示的にコンストラクタを生成したら、デフォルトコンストラクタは追加されない。
※引数ありのコンストラクタを生成した時、引数なしのデフォルトコンストラクタは生成されない。
初期化ブロック
クラスに直接書かれている初期化ブロック「{}」はコンストラクタより先に実行される。
this()
別のコンストラクタを呼び出すときに使う。
this()は、最初に記述しなければいけない。this()より先に何らかの処理を記述したら、コンパイラエラー
super()
カプセル化
何のためのクラスなのかとういクラスの目的を明確化するためのもの。
カプセル化はフィールドをprivateにし、アクセスするためのメソッドをpublicにすることでできる。
※すべてのメソッドを公開しなければいけないわけではなく、必要なものだけ公開すればよいため、公開メソッドと非公開メソッドの両方が混在するのは問題ない。
メソッドの引数
プリミティブ型
プリミティブ型の値をメソッドに渡すとき、その値はコピーされて渡される。そのため、呼び出したメソッド内で値が変更さえても、呼び出し元の値は変わらない。
オブジェクト型
オブジェクト型の引数では、呼び出し元から呼び出し先のメソッドに参照値がコピーされて渡される。そのため、二つのメソッドから参照するインスタンスは同じになる。インスタンスをの値を変えたら変更になる。
※呼び出し元と呼び出し先のメソッドが持っている参照は異なるもの。しかし、それぞれの参照が示す参照先にあるインスタンスは同じもの。
oracleJavaSilverの勉強日記(ループ構造の使用)
while文
条件式がtrueを戻す間、処理を繰り返すための構文。条件式は、必ず真偽値を戻さなければいけない。
構文
while(条件式){繰り返しの中で実行される処理}
do-while文
While文と意味は同じだが、条件に合致するかどうかにかかわらず、1回は処理を実行したい場合に使う。
構文
do{
//繰り返し処理
} while(条件式);
中かっこ省略
while文やdo-while文もif文などと同じように中かっこ「{}」を省略することができる。中かっこを省略した場合、1つの文だけが繰り返し処理として実行される。
do-while文で中かっこを省略した場合は、doの後ろには1つの文しか記述することはできない。もし、中かっこを省略したのに文を複数記述するとコンパイルエラーになる。
for文
構文
for(初期化文; 条件文; 更新文){繰り返し処理}
初期化文は、繰り返し処理内で使用する一時変数の宣言とその初期化を行う。
同時に複数の変数をカンマ「,」を使って宣言、初期化できる。複数の変数を宣言する場合は、変数が同じ型でなければいけない。
初期化文で宣言した一時変数はfor文のブロック内(中かっこの範囲)でしか使えない。
もし、for文の外で使った場合は、コンパイルエラーになる。
条件文は、繰り返し処理を実行するかfor文を抜けるかを判定し、真偽値を戻す式。
trueを戻すと繰り返し処理が実行され、falseを戻すとfor文を抜ける。
条件文を複数記述する場合は論理演算子を使う。
更新文は、繰り返し処理が終わってから一時変数の値を変更する式。
更新文を複数記述したい場合はカンマ「,」を使う。
二重ループ
外側のループが回る間に、内側のループが回る。たとえば、内側のループが3回まわるという条件を持っていた場合、外側のループ1回に付き、内側のループが3回まわる。そのため、外側のループが3回という条件だった場合は、外側3回×内側3回の合計9回まわることになる。例えば、次のコードだと、「hello」が合計9回表示される。
例
for(int i=0; i<3; i++){
for(int j=0; i<3; j++){
System.out.println("hello");
}
}
拡張for文
集合から1つずつ要素を取り出し、それを変数に代入してから繰り返し処理を実行する。拡張for文で扱える集合は、java.util.ArryaListなどがある。
構文
for (型 変数名 : 集合){繰り返し処理}
拡張for文では、変数の参照をコピーしているので、変数の参照を変更しても、集合には影響しない。
無限ループ
ループ文で条件式を省略したりなどによってずっと同じループが繰り返されること。
break
繰り返し処理を中断するには、breakを使う。二重ループの中で使われるbreakによって中断されるのは、直近にあるループのみ。
continue
繰り返し処理をスキップする。以降の処理をスキップしてループの条件判定に戻る。
ラベル
breakやcontinueの時に制御を移す箇所を自由に指定できる。
ラベルはあらゆる箇所に付けることができる。
oracleJavaSilverの勉強日記(配列の作成と使用)
配列
配列は、複数の値の集合を1つにまとめて扱うためのインスタンス。
配列には、2つの特徴がある。
・同じ型、もしくは互換性がある型の値しか扱えない
・扱える要素数はインスタンス生成時に決める。あとで要素数を変えることはできない
配列を使うには、他のオブジェクトと同様にnewキーワードを使って、配列のインスタンスを生成しなければいけない。
配列インスタンスの生成
new int[3];
他のオブジェクトと同様に、変数に格納した参照を経由して扱う。
配列型変数の宣言
int array;
※配列型変数には、配列インスタンスの参照を代入する。変数に値が直接入るわけではない
※「int array;」の大かっこは、変数名の後ろに記述することもできる。
※配列型変数に宣言時に、要素数の指定はできない。
多次元配列
・配列は複数の参照をひとまとめにして扱うことができる。
・配列そのものもインスタンスであり、参照を投資て扱える。
このように、さらに他の配列への参照を持っている配列のことを多次元配列と呼ぶ。
2次元配列(例)
int array;
int array;
3次元配列(例)
int array;
int array;
配列インスタンスの生成
配列インスタンスの生成には、要素数の指定をしなければいけない。
要素数の指定は、整数値で記述しなければいけない。また、要素数の指定にはint型を使う。同じ整数値でもlong型は使えない。
多次元配列の場合は、1次元目の要素だけは省略することができない。
多次元配列の場合は、変数とインスタンスの間で次元数を一致にしなければいけない。
配列インスタンスと要素の値
要素のデフォルト値は、配列インスタンスを生成した直後は、これらの値で要素は初期化されている。
整数型:0
浮動小数点数型:
真偽値:false
文字型:¥u0000
オブジェクト型:null
配列インスタンス生成と同時に要素の値を初期化したい場合は初期化演算子「{}」を使う。
初期化演算子を使用して要素の値を初期化
int array = {10,20,30};
int array=new int{2,3};
どちらのコードも同じ意味を持つが、校舎の方法には注意点がある。
newと初期化演算子の両方を使った場合は、大かっこ「」の中に要素数を指定してはいけない。
初期化演算子には「変数宣言と同時にしか使えない」というルールがある。
そのため、変数宣言と配列のインスタンス生成を分けて記述することはできない。
例
int d;
d = {2,3};
ただし、配列インスタンスを作る時に大かっこを使って、明示的に次元数を記述すれば、コンパイルエラーにならない。
例
int d;
d=new int{2,3};
null
nullで初期化されている要素を、lengthを使って要素数を数えようとしたときは、NullpointerExceptionという例外がスローされる。
継承と実現関係
あるクラスが継承関係にあるとき、スーパークラス型の配列型変数で、サブクラスのインスタンスの集合を扱える。
Object[] obj = {"A", "B", "C"};
Object型しか扱わない配列型変数とStringしか扱わない配列インスタンスは、扱う型が異なるが、StringクラスはObjectクラスを継承するため、コンパイル・実行できる。
配列型変数は、Object型に暗黙的に型変換できる。
cloneメソッド
同じ値を持った配列インスタンスが複製される。
2行目で、arrarAと同じ値を持った配列インスタンスを生成
3行目は、値は同じだがインスタンスの参照は異なるため「false」
5行目で、arrayAと同じ値を持っているので、出力される。
arraycopyメソッド
配列の任意を範囲だけコピーしたい時に使う。
第1引数:コピー元となる配列
第2引数:コピー元のどの位置からコピーを開始するか(0始まり)
第3引数:コピー先の配列
第4引数:コピー先配列のどの位置からコピーを開始するか(0始まり)
第5引数:第2引数の位置からいくつの要素をコピーするか
例
System.arraycopy(arrayA, 1, arrayB, 0, 4);
「arrayAの1番目から4つの要素をarrayBの0番目からコピーする。」という意味になる
oracleJavaSilverの勉強日記(演算子と判定構造の使用)
代入演算子
代入演算子は左右のオペランドの評価が終わっていなければ代入できない。
「+=」の意味は「a+=10;」だった場合、「a=a+10」と同じ意味。変数aの値に10を足してから、変数aに代入する。「-=」や「*=」も同じ意味。
マイナス演算子
マイナス演算子「-」には、左オペランドから右オペランドの値を引く二項演算子と正負の値を反転させるために使う単項演算子の2種類ある。
二項演算子はただの引き算。
単項演算子はプラスの値であればマイナスに、マイナスであればプラスになる。
型変換
数値を演算する時、演算子の両側のオペランドは同じ型でなければいけない。もし、オペランドの型が異なる場合には、小さい方の型は大きい方の型に自動的に変換される。
数値リテラルは、範囲が大きい型から小さい型に代入する時は明示的なキャスト必要。
ただし、byteやshort型の変数に代入する整数リテラルの場合、その値が型の範囲内であればコンパイルエラーにならない。
インクリメントとデクリメント
インクリメント演算子「++」とデクリメント演算子「--」は、変数の値に1を加算したり、1を減算したりするための演算子。
前値インクリメント「++a」と後値インクリメント「a++」
前値インクリメント「++a」は、先に加算し、その値をaに入れる。
後値インクリメント「a++」は、aに前の値を入れて、その後に加算して、aに入れる。
関係演算子
関係演算子は、左右のオペランドの値を比較し、真偽値を戻す演算子。
※instanceof以外は数値以外には使えず、使った場合コンパイルエラーになる。
論理演算子
&や&&は両方がtrueの時だけtrueになる。
|や||は両方がfalseの時だけfalseになる。
&&や||は「ショートサーキット演算子」とも呼ばれ、左オペランドの結果によっては右オペランドを評価しない。
&&演算子は左オペランドがfalseを戻すのであれば、falseが確定するので右オペランドは評価しない。※&演算子の場合は評価する
||演算子は左オペランドがtrueを戻すのであれば、trueが確定するので右オペランドは評価しない。※|演算子の場合は評価する。
演算子の優先順位
演算子には優先順位があり、同じ優先順位であれば式は左から順に実行される。
(),++,--が最優先
*,/,%が同順位
+,-が同順位
同一性と同値性
同一性は同じインスタンスを参照していること
同値性は違いインスタンスを参照しているが、同じ値。
同一性は「==演算子」で判定する。戻り値はbooleanで、左右のオペランドが同じインスタンスを参照していたら、trueを返す。
同値性は「equalsメソッド」で判定する。Objectクラスのequalsメソッドは同一性を判定していることになってしまうので、オーバーライド前提。
オーバーロード
オーバーロードは同じ名前で複数メソッドを定義できる。
オーバーロードのルール
・同じ名前でメソッドを定義する。
・各メソッドの引数の型・個数・並びが異なるようにする。
コンスタントプール
文字列リテラルは、同じインスタンスへの参照が使いまわしにされる。そのため、同じ参照になる。
※new演算子を使って、明示的にインスタンスを生成すれば、別の参照になる。
if文
if文の構文
if(条件式){ 条件に一致したとき実行する処理}
if文の中の{}は省略可能で、省略した場合は、次の一文だけ実行される。残りのやつはif文とは無関係と判断される。
if-else if文
if-else if文は、elseとif文の間で改行することはできない。もし、改行したらif文はelse文の中にある分岐として解釈される。
switch文
条件式が戻す値と一致するcace式を記述する。条件式が戻せる値の型には制限がある。
・int型以下の整数型とそのラッパークラス
・文字と文字列
・列挙型(enum)
switch文では、cace値にマッチする処理が実行される。処理が終わればbreakを使って抜けるようにする。もし、breakを記述しなかった場合は、現れるすべてのcase式の処理がbreakが現れるまで実行される。一致するものが無ければ、default文以降が実行される。
case値
case値として使用できる値は、条件がある
・条件式が戻す値と同じ型か互換性がある方であること
・定数であるか、コンパイル時に値を決めることができること
・nullでないこと
※定数はfinal宣言された変数かリテラル
三項演算子
条件に合致するかどうかで、戻す値を変更する演算子。
構文
真偽値式?trueの場合に評価する式:falseの場合に評価する式