はじめに
JavaGold取得を目指して、まず月末は、昨年取得したJavaSilverの復習から入ります。
そして、MOSが取得できたので、全力で対策します。
各日記毎に分けていますが、一つずつ進めます。
JavaGoldはWindowsのPCでSTS(Eclipse)
プロになるJavaはUbuntuのノートPCでIntellij IDEAを使用します。
Eclipseのショートカットで「実行」が効かない...
IntelliJ IDEAは全て使用できる...
※誤解していた内容も包み隠さず、記載いたしますので、日記枠にしました。
内容
アウタークラスとインナークラス
テーマ1:staticなインナークラスの呼び出しとstaticインナークラス外部の値へのアクセス
①staticなインナークラスの呼び出し
public class CH1_Q3 {
private int value1 = 1;
private static int value2 = 1;
public static class judgeGetValue{
private int getValue() {
...return value2 * 1;
}//----------------------------------------------------------------------
public class Item{
...
}
}
上記のクラスを呼び出す時、
new CH1_Q3.judgeGetValue().getValue()でアクセスができる。
アウタークラスのCH1_Q3をインスタンス化して、static領域にあるjudgeGetValueクラスにアクセスするものと考えていたが、new CH1_Q3()...とすると動かない。
流れとしては、「new演算子でCH1_Q3をインスタンス化する。その際にCH1_Q3のコンストラクタを呼び出す」と理解していたが違うのだろうか...
今まで、new judgeGetValue().getValue()としていた事からも、結局同じことをしているのだろうか。
切り分け
staticじゃなくて、ただのインナークラスならどうか。
上記Itemクラスをインスタンス化してみる。この時、あえてItemクラスを直接インスタンス化してみる。
new CH1_Q3.Item()とすると...
アクセス可能な型 CH1_Q3 のエンクロージング・インスタンスがありません。型 CH1_Q3 のエンクロージング・インスタンスで割り振りを限定する必要があります (たとえば x.new A() で、x は CH1_Q3 のインスタンス)。
そもそも、
New演算子は初期化と記憶域の確保の2つに機能が分かれているとの事。
Javaでは初期化とオブジェクトの生成。プリミティブ型には必要ない。
以上の事から、
・new CH1_Q3()にてヒープ領域にアウタークラスCH1_Q3のインスタンスが生成される。
・インナークラスjudgeGetValueはスタティック領域に生成されている。
・ヒープ領域にインナークラスjudgeGetValueのインスタンスはないため、直接、static領域から呼び出さなくてはいけない。
・staticであろうとも、オブジェクトを利用する際には、プリミティブ型を除いて、初期化と記憶域の確保をしなければならない。
よって、new CH1_Q3.judgeGetValue().getValue()となる。
----------------------------
2月3日追記
変な解釈をしていた。
シンプルにstatic領域にあるクラスをインスタンスを生成しなければならない。
だから、
new com.example.demo.javaGold.CH1_Q3.judgeGetValue().getValue()
でも良い事になる。
-------------------------------
②staticなインナークラスの外部の値へのアクセス
上記コードのgetValue()内にて、同じstaticであるフィールドvalue2にはアクセスできる。
ただ、非staticフィールドvalue1のアクセスはできない。
テーマ2:非static領域からstatic領域へのアクセスとその逆
public static class Inner{
}
public class Inner_nonStatic{
new Inner();
}
上記のように非static領域からstatic領域へのアクセスはできる。
しかし、その逆はできない。
CH1_Q2(アウタークラス)からインスタンス化して生成する。
ローカルクラス
ローカル変数とローカルクラスのライフサイクルの違いについて、検証したかったができなかったので、ひとまず、下記を意識する。
・ローカルクラス内で、ローカル変数を扱うときは実質的にfinalでなくてはならない。
・使用するローカル変数の宣言は、ローカルクラスの先にしなければならない。
※いつかちゃんと理解したい...
感想
上記に手こずり、プロJavaがあまり進めなかったうえにJavaGoldもテストケースを考える余裕がなかった...
入力した年、月、日のintの値をLocalDateに変換し、formattedで指定した書式で返すというメソッドを作り、テストケースを作成のみ。
まだ読んでいる段階なので記載していませんが、logging含めた独学であまり触れていなかった範囲が刺さった。
進め方にまだまだ無駄な時間があるので、引っ越し日までに安定させたい。