新米エンジニアのスキルハンター記録

ハンターハンター好きなITエンジニアのアウトプットブログ

【Java SE 11 Silver対策】黒本5章(配列の操作)チェックリスト

今回は調べたわけではなく、「5章 配列の操作」をまとめた内容になります。


・配列型変数の宣言
以下、全部OK
int a;
int b
;
int c;
int d ;
int e;
int f;

 

・宣言時に要素の指定をしてはいけない。
int[3] a; はNG
配列型変数にはインスタンスの参照が入るだけ。要素がいくつかどうかは無関係

 

・配列インスタンスの作成時は、必ず要素数を指定する
int a = new int; はNG

int a = new int[2]; はOK

 

・要素数は必ずint型の整数値
int a = new int[1L]; はNG
int
a = new int[1.2]; はNG

 

・変数とインスタンスの次元数は必ず一致
int a = new int[2][3]; はNG

int a = new int[2][3]; はOK

 

・1次元目の要素の省略はできない。2次元目はできる。

以下、NG
int a = new int[4];

以下、OK
int a = new int[3];
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[4];

 

・配列のインスタンスを作成しても要素自体は作成されない。
int a = new int[2]
上記の記述をしても、a[0]にはまだ何も入っていない。
デフォルト値は以下になる。
整数値:0
浮動小数点数:0.0
真偽値:false
文字列型:\u0000
オブジェクト型:null

Item items = new Item[2];
item[0].price; ← item[0]がnullなので、実行時にNullPointerException発生

 

・配列のインスタンスの生成と要素の初期化を同時に行うには
int a = {1,2,3};
int
b = {{1,2},{3,4,5},{6}};

 

・配列のインスタンスの生成と要素の初期化の方法は二つ

以下はOK
①int a = {1,2,3};
②int a = new int{1,2,3};

以下はNG

int a = new int[3]{1,2,3};

 

・要素0のインスタンスの作成(コンパイルエラーは出ない)
int array1 = {};
int array2 = new int[0];
int
array3 = new int{};
int
array4 = {};
int
array5 = new int[0][0];
int
array6 = new int{};

 

・初期化子を使う際の注意。初期化子を記述する行に次元数が記入されていればOK
以下はOK
int b = {1,2,3};
int c;
c = new int
{1,2,3};
int d;
d = new int{};
以下はNG
int e;
e = {1,2,3};

 

・cloneメソッドについて
public class Main {
    public static void main(String args) throws Exception {
        int arrayA = {1,2,3};
        //cloneメソッドで同じ値を持った配列インスタンスを複製
        int
arrayB = arrayA.clone();
        //複製したので、もちろんインスタンス(参照先)は異なる
        System.out.println(arrayA == arrayB);
        for (int i : arrayB){
            System.out.println(i);
        }
        
        int arrayC = {{1},{2,3},{4,5,6}};
        int arrayD = arrayC.clone();
        //2次元配列の場合、1次元目のインスタンスは別のインスタンス
        System.out.println(arrayC == arrayD);
        //ただし、2次元目のインスタンスは同じインスタンス(同じ参照を持っている)
        System.out.println(arrayC[0] == arrayD[0]);
    }
}

◆出力
false
1
2
3
false
true

 


以上、おわり!

 

Silverの勉強も大詰め!

 

【Java SE 11 Silver対策】JVM、JDK、JREについて

今回は用語の復習

 

何度も聞いたことあるけど、違いがよく分からんシリーズです。(いま作りました。)

 

調べてみました。いつものことですが、ざっくり書いてます。

 

 

JVMJava Virtual Machine

Javaプログラムの実行に必要なソフトウェア


JREJava Runtime Environment)

Javaプログラムの実行に必要なソフトウェア一式
Java実行環境やJavaランタイムと呼ばれる。JVMを含んでいる。


JDKJava Development Kit

Javaプログラムの実行や開発に必要なソフトウェア一式
Java 開発環境と呼ばれる。JREを含んでいる。

 



文章より図の方が分かりやすいですね。

 

JDKは各OS用のものが用意されている。

JREJDKに含まれているため、個別にセットアップする必要はない。

Eclipseなどの統合開発環境IDE)にはJDKは含まれていないので、別途インストールする必要がある。

 


サクレのレモンを食べながら、今日はこの辺で

【Java SE 11 Silver対策】ソースファイルモードについて

今回の内容は黒本に記載されているので、特別調べた内容はありません。


記憶に定着させたかったので、書いています。

 

ソースファイルモードについては、もちろん知りませんでした。

 

簡単に説明すると、今まではソースファイルの実行をする場合、「javacコマンドでコンパイル」→「javaコマンドで実行」の2回の操作が必要でした。
だがしかし、ソースファイルモードだと、これを1回でやってくれます。なんと言うか・・・どんどん楽になっていきますね。

※ソースファイルモードはJava SE 11から使えます

 

メリットしては初学者がストレスフリーに学べる点ぐらいでしょうか。

コンパイルして~実行して~って面倒ですからね。

(っていうのを最初は黙々とやってました・・・はい)

 

まぁでも、ちょっと動作確認したい時はオンライン実行環境の「paiza」、がっつり開発するときは「eclipse」を使っているので、今後使う見込みは・・・今のところはなさそうです。

 

ちなみにコンパイル自体はもちろん行われていて、クラスファイルに相当するバイトコードをメモリ上に出力しているそうです。
(そんなことできるんや・・・)

 

また、javaコマンドの引数のファイル名の拡張子が「.java」の場合は自動的にソースファイルモードになるそうですが、なんと、「.java」じゃないファイルも「--source」オプションをつけることで、ソースファイルモードで実行できるようです。

 

この辺りも、必要になることもないんじゃないかなーと思います。

 

あと、覚える必要があるかは謎ですが、ソースファイルモードですと、クラス名とファイル名を一致させる必要もないそうです。
(ほえー)


一応、黒本に記載されているので、覚えようと思いますが、そこまで重要ではないのかなーと思っています。

 

 

 

連日暑い日が続きますが、自身の目的の為に勉強中の方のツイートやブログを見て、モチベを維持しております。

 

一緒に頑張りましょう!

 

 

【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』と出力します。
これはなんでかよくわからんけど、仕様らしいので、暗記かな