【Java SE 11 Silver対策】final修飾子について
お待たせしました。(誰も見てなくても言うやつ)
本日のテーマは『final修飾子』
finalと言えば、定数に使う修飾子ですよね、はい。・・・・それ以外の用途は出てきますか?
出てきませんが、実はクラスにも、メソッドにも付けられたりします。
なんとなーく見たことあるような見たことないような・・・ちょっとふわふわしていたので、調べてみました。
とりあえず三つあるらしい
①final 変数 → 定数
②final メソッド → オーバーライド禁止
③final クラス → 継承禁止
あれ・・・②と③知らんかった・・・そうだっけ?え?皆さん知ってました?
確認してみよう!
①final 変数 → 定数
public class Main {
public static void main(String args) throws Exception {
// 定数
final String STR = "aaa";
System.out.println(STR);
}
}
◆出力
aaa
②final メソッド → オーバーライド禁止
public class Main {
public static void main(String args) throws Exception {
Parent parent = new Child();
parent.test();
}
}
class Parent {
final void test(){
System.out.println("サンダー");
}
}
class Child extends Parent {
@Override
void test(){
System.out.println("サンダガ");
}
}
◆出力
Main.java:17: error: test() in Child cannot override test() in Parent
void test(){
^
overridden method is final
1 error
③final クラス → 継承禁止
final class Parent {}
class Child extends Parent {}
◆出力
Main.java:14: error: cannot inherit from final Parent
class Child extends Parent {
^
1 error
たしかに、そんな感じのエラーが出てますね。()
実際にソースを打ち込んだので、これはもう忘れないでしょう!(という願い)
というわけで今回は『final修飾子』についてでした~
①final 変数 → 定数
②final メソッド → オーバーライド禁止
③final クラス → 継承禁止
ま~た~あ~した~
【Java SE 11 Silver対策】ラッパークラスとボクシングについて
ちょっと間が空きましたが、気にしません。継続第一です。
今回はラッパークラスについて
業務の時はほとんど意識しませんでしたねー
よーするに全然分かっておりません、はい。
Silverの試験ではきっちり出てくるので調べてみました。ちなみにBronzeの試験はでは出てきません。(たしか)
基本データ型のそれぞれにラッパークラスが用意されています。
ほとんどが頭文字を大文字にするだけですが、intとcharだけちょっと違うので注意です。
boolean → Boolean
char → Character ※注意
byte → Byte
short → Short
int → Integer ※注意
long → Long
float → Float
double → Double
で・・・ラッパークラスってなんなの?って話ですが
例えばInteger型の場合は、int型の値を持ち、しかも値を操作するメソッドも持っている「オブジェクト」のようなイメージ・・・らしいです。
そういえば、昔、先輩にこんなことこんなこと言われました。
・用がなければ基本型で。必要があるならラッパークラスを使う。
・ラッパークラスはnullが入るから気を付けて。
この話を聞いて、(当時はチンプンカンプンだったので、)基本型だけ使ってコード書いてるつもりでした。
実際はオートボクシングの機能つかってラッパークラスもガンガン使っていたんですけどねーまぁいいや。
調査は以上です。Silver合格を目標としますので、ここまで良いかな。あと、ラッパークラスの具体的なメソッドについて、記載しません。多分上記の話を覚えておけば、黒本でラッパークラスが出てきても、「あーはいはい、そういうのあんのねー。」で済むと思うので。
そして、もう一つ「ボクシング」について
こちらも黒本でチラホラ見かけた気がするので、一応
ラッパークラスと基本形の変換を自動的におこなってくれるのが「ボクシング変換」
int → Integer とInteger → int の両方の例を以下に記載。ついでにボクシングを使わない方法も記載
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("int → Integer");
int primitiveNum = 1;
Integer a = primitiveNum; //ボクシング変換
Integer b = Integer.valueOf(primitiveNum); //メソッドを使う
Integer c = new Integer(primitiveNum); // コンストラクタを使う
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println("Integer → int");
Integer lapperNum = 2;
int d = lapperNum; //アンボクシング変換
int e = lapperNum.intValue(); //メソッドを使う
System.out.println(d);
System.out.println(e);
}
}
うーん・・・とりあえず、『「基本型」←→「ラッパークラス」の変換を自動的に行ってくれる機能』という認識でよいかな・・・?
【Java SE 11 Silver対策】前々から気になってた『new ClassA().methodA()』という書き方について
実は前から気になっていました。
作成したインスタンスから直接呼ぶ?「new ClassA().methodA()」という書き方・・・
黒本にもちょくちょく出てきます。
もちろん私の普段使っている書き方は『ClassA test = new ClassA()』からの~『test.methodA()』という一般的なヤツです。
『new ClassA().methodA()』の書き方のメリットを考えてみると・・・戻り値が必要ない時とか?
うーんよくわからん。Golderの先輩に聞いてみよう。
とりあえず、試験で出てきても日和らないように、一応自分でタイピングだけはしておいて、確認
public class Main {
public static void main(String[] args) throws Exception {
Main test = new Main();
test.output();
new Main().output();
}
void output(){
System.out.println("aaaaaa");
}
}
//出力結果
aaaaaa
aaaaaa
ですよねー
というか黒本の問題見て気づいたのですが、Mainクラスも他のクラスと同様にMainクラスのインスタンス作れるのですね・・・
言われてみれそりゃそうだけど、見たことなかったので、これも勉強になりました。
よーしJavaSilverの試験は再来週ぐらいには受けようかな~
以上!!!
【Java SE 11 Silver対策】プリミティブ型とnull
最近、作成している記事の文章量が減ってきましたね。
でも意外とネタはあるからまだまだ続けます。
需要なくても続けます。割と記憶に残りやすいので・・・!
今回はnullについてです。
いきなりですが、プリミティブ型の変数にはnullは代入できません。
黒本にはこう書かれています。
『「null」は変数が何も参照していないことを表すリテラルです。』
な・・・なるほど・・・
こういう風に書いてくれると覚えやすいですね。他の言語でもそうなのかな?
これで一緒忘れない。
おまけ
printlnメソッドでnullの変数を指定すると、『null』と出力します。
これはなんでかよくわからんけど、仕様らしいので、暗記かな
【Java SE 11 Silver対策】スタック領域とヒープ領域とは
「スタック領域」と「ヒープ領域」ってご存じでしょうか。
なんとなく理解してるつもりですが、復習!
■スタック領域(ローカル変数領域)
スレッドが作られると、OSがそのスレッドに対してスタックと呼ばれるメモリ領域をそのスレッドが終了するまで割り当てます。スタックは、スレッド上で実行されるメソッドや関数が使用する一時的なデータを保持する領域です。プリミティブ型変数の値や参照型変数の参照(インスタンスへのアドレス)を保持します。
■ヒープ領域
参照型変数(オブジェクト)のインスタンスが保持されます。
用語はともかく、参照型変数(オブジェクト)が持っているのは、実際の値ではなく、インスタンスへのアドレスである点はきちんと理解しないとまずいです。
Bronzeでも出てきた内容なので、ある程度分かっているつもりですが、おさらいでした。
以上!!
【Java SE 11 Silver対策】インターフェースの抽象メソッドにabstract修飾子つかないの?
だいぶピンポイントな話題ですが、気になっていたので調べた。
暗黙的に省略されているらしい・・・まぁインターフェースの時点で分かるよねって話かな
これが抽象クラスの場合は、抽象メソッドも通常のメソッドも両方記載できるから、abstractの省略はもちろんできない
全然関係ないけど、インターフェースの抽象メソッドのアクセス修飾子は必ずpublic。上記と同じ理由か分からないが、省略可能
あとついでに、インターフェースではフィールドは持てないがpublicでstaticでfinalな定数は持つことが可能。これも覚えなきゃ。
内容が少ないけど、これで終わり!
【Java SE 11 Silver対策】スレッドセーフとは
スレッドセーフ・・・聞いたこともないです。
いや、JavaのBroze取得した時に聞いたような・・・
というわけで今回も調べてみました。
まずはプロセスとスレッドについて復習
・プロセス
アプリケーションが起動する際に、割り当てられたメモリ空間
マルチプロセスでは、プロセス(アプリケーション)を複数同時に起動し、OSが交互にプロセスを切り替えながら実行する。
・スレッド
プロセス内で実行される一連の処理
マルチスレッドでは、1つのプロセス内で複数のスレッドを切り替えながら実行する
Javaはシングルプロセス、マルチスレッド
復習はここまで・・・
プロセス間ではメモリ空間は共有されないが、スレッド間ではメモリ空間が共有される。
マルチスレッドのJavaでは、異なるスレッドで同じデータへアクセスができてしまう。
へー
ローカル変数はスレッドセーフな変数
スレッド毎にある「スタック領域」 にデータを持つので、異なるスレッドからはアクセスできない
インスタンス変数(フィールド)や、クラス変数(static変数)はスレッドセーフでない変数
各スレッドで共有される「ヒープ領域」にデータを持つので、異なるスレッドからアクセスできる
ふむふむ
で、試験ではとりあえず「ArrayListはスレッドセーフではないコレクション」と覚えておけばよいみたい
・
・
・
この辺りちゃんと意識して今まで実装しましたか言われると、冷や汗がでますが、今回の調査が今後に活かせればよし!