本年度中に、Java Silver及びJava Goldの資格取得を目指しています。
現在エンジニア3年目にも拘らず、今までの経験言語がJavaだったりC#だったりしてふらふらしていたので、ここらで一発、言語について基本的な知識を持っておこうと思ったのがきっかけです。
2年目までは言語知識を深く知らなくても、先輩の作った基盤の上でなんとなくプログラミングできていたように思えます。そのせいか、恥ずかしながら3年目になって(試験勉強を始めて)Javaの理解が進んだ点がいくつかあるので、備忘程度に記載します。
出典
Java SE 8 Silver試験「Javaのデータ型の操作」単元より
インスタンスとガベージコレクション
Object a = new Object(); //【I】Objectインスタンスを生成し、Object型の変数aの参照先とする
Object b = new Object(); //【Ⅱ】Objectインスタンスを生成し、Object型の変数bの参照先とする
Object c = a; //【Ⅲ】Object型の変数cの参照先を、変数aの参照先インスタンスとする
a = null; //【Ⅳ】変数aが何もインスタンスを参照しないよう設定
b = null; //【Ⅴ】変数bが何もインスタンスを参照しないよう設定
図示してみると
1,2行目でObject型変数a,bに対して、それぞれの参照先となるObjectインスタンスが生成される。↓
3行目で変数cが生成される。参照先はaが参照しているインスタンスと同じ。↓
4,5行目で変数a,bがどのインスタンスも参照しないよう設定(=null)されている。もともとaが参照していたインスタンスは引き続き変数cに参照されるのに対し、bが参照していたインスタンスは参照元を失う。bが参照していたインスタンスは今後使用予定がないので、JVMのガベージコレクションの対象となる。↓
ガベージコレクションについては
○○進数を指定したint型の初期化
int a = 111; //よく使うやつ
int a = 0x10B; //冒頭に「0x」を付けると12進数 10進数では1*12*12+12*0+1*11 = 155
int b = 0b100001011; //冒頭に「0b」を付けると2進数 10進数では267
int c = 0727; //冒頭に「0」を付けると8進数 10進数では7*8*8+2*8+7*1 471
整数リテラルの書き方
※リテラル=「代入するときの等号の右側の値」
int a = 123_456_789; //OK 間にアンスコ書いてもOK 値としては123456789
int b = _123_456; //NG アンスコから始めるのはNG コンパイルエラー
int c = 123_456_; //NG アンスコで終わるのもNG コンパイルエラー
int d = 123_.45; //NG アンスコの横に記号が来るとNG コンパイルエラー
long e = 123.45_L; //NGアンスコの横に記号が来るとNG コンパイルエラー
float f = 123.4_5F; //OK アンスコの横に記号泣ければOK 値としては123.45(float)
参考 => 【Java】数値リテラル内のアンダースコア
char(文字型)に入ってもいい値
char a = 'a'; //OK シングルクウォーテーションで囲むのが習わし
char b = '\u30A2'; //OK Unicode値を代入できる
char b = 89; //OK Unicode値の10進数値を代入できる
char c = null; //NG char(というかプリミティブ型変数)はnullを持てない。初期値は'\u0000'
識別子の命名規則
識別子...変数やメソッド、クラスなどの名前のこと。
int $a = 100; //OK $は変数名に使える
int _b_ = 100; //OK _は変数名に使える
int ${a} = 100; //NG 変数名に使える記号は$と_のみ コンパイルエラー
int g.a = 100; //NG 変数名に使える記号は$と_のみ コンパイルエラー