Java


[JavaSilver対策] 特に沼っているところ

2026-04-29 23:16

試験に向けて課題だったところの備忘録と知識の整理を兼ねて

特に沼だったところ

  • ポリモーフィズム
  • コンストラクタ

ポリモーフィズム

コードの例

class Animal {
    void eat() { System.out.println("食べる"); }
}

class Cat extends Animal {
    @Override
    void eat() { System.out.println("魚を食べる"); }
    
    void meow() { System.out.println("ニャー"); }
}

public class Test {
    public static void main(String[] args) {
        Animal a = new Cat();
        a.eat();   // 何が出力される?
        // a.meow();  // これはエラー? OK?
    }
}

上のようなコードがあるとき、

  • 今まではCatでnewしていたのでCatがもつメソッドは使えると思っていた。 →実際はAnimal型で宣言しているため、Animal型で定義したメソッドしか使えない(実行内容はCat)

得たこと

変数型はメガネのようなもの(newしたオブジェクトにかかわらず使えるメソッドは型次第)

コンストラクタ

こちらもコードの例

// 記事用のサンプルコード
class Animal {
    String name;
    
    Animal(String name) {
        this.name = name;
        System.out.println("1. Animalコンストラクタ: " + name);
    }
}

class Dog extends Animal {
    String breed;
    
    Dog(String name, String breed) {
        super(name);
        this.breed = breed;
        System.out.println("2. Dogコンストラクタ: " + breed);
    }
}

class Poodle extends Dog {
    String color;
    
    Poodle(String name, String breed, String color) {
        super(name, breed);
        this.color = color;
        System.out.println("3. Poodleコンストラクタ: " + color);
    }
}

public class Test {
    public static void main(String[] args) {
        Poodle p = new Poodle("ポチ", "プードル", "白");
        // Q: 出力順序は?
    }
}

上のようなコードで

  • poodle → dog → animalと呼ばれると思っていた。
  • super()がコンストラクタの最初でされる(暗黙的、あるいは明示的)ためスーパークラスから実行される。
  • また、super()super(name)のように引数付きで既にある場合は自動で実行されないので定義する必要がある。

[JavaSilver対策]紫本1章まとめ

2026-04-29 23:16

本章は以下の4つ

  • Javaの概要
  • Java環境とJDK
  • コマンドラインでのJavaプログラムのコンパイルと実行
  • パッケージ宣言とインポート

Javaの概要

  • オブジェクト指向言語である
  • コンパイルした後のバイトコードはJVM(Javaが提供する仮想マシン)上で動作する →どんなOSでも動作する

Java環境とJDK

  • Javaアプリケーションの実行にはJVMとクラスライブラリなども必要。 →それらを含んだ実行環境をJRE(Java実行環境)とよぶ
  • Java開発に必要な環境がまとまったものをJDK(Java開発環境)と呼び、JREも含む

コマンドラインでのJavaプログラムのコンパイルと実行

  1. エディタなどで作成した.javaファイルをソースコードやソースプログラムなどと呼ぶ

  2. コンパイルにはjavacコマンドを使用する (拡張子付きで指定する) javac (ソースファイル名).java

  3. コンパイルに成功すると.classファイル(バイトコード)ができる。 コンパイルエラーが発生するとエラーメッセージが表示される

  4. javaコマンドでクラスファイルを指定することでプログラムを実行できる (拡張子はつけない)

java (クラス名)

ソースファイル作成で大事なところ

  • main()メソッドは必ずpublic static void(返り値を持たない) のキーワードを指定し、mainという名前にする。 また、引数にString型の配列String[] aを受け取る必要がある。(可変長引数String... bも可)
  • ソースファイルモードでの直接実行 java (ソースファイル名).java

パッケージ宣言とインポート

パッケージはクラスを管理する仕組み。主なメリットは

  • クラスの整理・分類(ソースファイルではなくクラスファイル)
  • クラス名の衝突を避ける(名前空間の提供)
  • アクセス制御 パッケージ化(格納すること)にはpackageキーワードを使用する

package パッケージ名;

  • ソースファイルの1行目に書く(1ファイルに1つ)
  • サブパッケージを書くときは.(ドット)で区切るe.g.com.example.main (企業とかだと会社のドメインを逆に書くのがお作法らしい) コンパイルされたパッケージクラスには完全修飾名で実行する java com.example.main

パッケージ化されたクラスのコンパイル・実行

  • javacの-dオプションを使えばパッケージのディレクトリがないときにパッケージと同じディレクトリ構成を生成してくれる

javac -d パッケージを生成するディレクトリ コンパイル対象のソースファイル名

  • -cp -classpath オプションを使用することでクラスを検索するパスを指定できる。

インポート

import 完全修飾名;

  • ソースファイルの先頭に記述する(パッケージ宣言の次)
  • パッケージ全体をインポートするときは*を指定(クラス名の省略のみ可能,末尾だけ)
  • インポートしていないクラスを使用する時は完全修飾名で指定

標準API

  • java.lang(自動インポート) →基本的なクラスを提供(StringやObjectなど)
  • java.io → 入出力機能(PrintStreamやWriter,Readerなど)
  • Java.util → 便利機能(コレクションフレームワークなど)
  • java.util.function →関数型インターフェース(FunctiionやConsumerなど)

[JavaSilver対策]紫本第2章まとめ(前半)

2026-04-29 23:16

第二章 Javaの基本データ型と文字列の操作

  • リテラル
  • 変数・定数の宣言と初期化
  • ローカル変数の型推論
  • 配列
  • コマンドライン引数の利用
  • 文字列の操作

リテラル

リテラルは、ソースプログラム内に直接書き込まれた値で変更できない

数値リテラルには整数リテラル(int)と浮動小数点数リテラル(double)がある。

整数リテラル

  • 100 = 10進数
  • 0b1100100 = 2進数(先頭に"0b")
  • 0144 = 8進数(先頭に"0")
  • 0x64 = 16進数(先頭に"0x")

浮動小数点数

  • 3.1415 = 10進数
  • 31415e-4 = e or Eを使用した指数標記。31415 * 10 ** -4 を表す

整数リテラルはデフォルトでint,浮動小数点数リテラルはデフォルトでdouble

longやfloatとして認識してほしい場合は100L3.1415Fとする(大文字の方が見やすい)

数値リテラルの桁の間にアンダースコアをうめられる

以下の場合はNG

  • 数値の先頭、末尾 (int x = _100)
  • 小数点の前後 (float x = 3._1415)
  • FやL接尾辞の前 (long x = 100_L)
  • 2進数や16進数の接頭辞の途中や直後 (int x = 0b_1111_0000) ↑8進数の場合はアンダースコアがあってもコンパイルできる(int x = 0_1234)

文字と文字列リテラル

1文字を'文' '字'といい、複数は"文字列"という ""を空文字列といい、文字列に含まれる

テキストブロック

  • """で囲んだ範囲を複数行の文字列リテラルとして扱える
    (今まで+appendしていたのが楽になった)
  • 開始の"""の直後には文字列を記述できない(スペースやタブはOK)
  • 終了の"""は文字列の直後に記述できる
  • 行末のスペースは削除される

変数・定数の宣言と初期化

変数と命名規則

変数やクラス、メソッドなどにつける名前を識別名という 命名にいくつかルールがある

  • 一文字目は英字(A~Z,a~z), ドル記号$, アンダースコア_
  • 二文字目以降は↑に加えて数字も可
  • Javaの予約後は使用不可(e.g. abstract, extends)
  • 文字数の制限はない

データ型

Javaはコンパイル時に型が決定する(静的型付け言語)
変数宣言の時にデータ型を明確に指定する必要がある

Javaのデータ型は大きく以下の2つ

  • 基本データ型(プリミティブ型)
    つぎの8つ
    byte, short, int, long, float, double, char, boolean
    それぞれ8bit整数、16bit整数、32bit整数、64bit整数、32bit浮動小数点数、64bit浮動小数点数、文字、真偽値
  • 参照型
    文字列や配列など↑の基本データ型以外の全て

変数宣言と代入

以下のようにして行う

  • 変数宣言
    データ型 変数名;
  • 代入
    変数名 = 値;
    =の左辺と右辺は基本的に同じ型となる
int num;  //変数宣言
num = 10;  //numに値を代入

変数宣言と代入を1行で済ませる方法もある int num = 10;

main()メソッドなどのブロック内で使う変数をローカル変数と言い、使用する前には必ず初期化する必要がある。


[JavaSilver対策]紫本第2章まとめ(後半)

2026-04-29 23:16

定数

変数宣言にfinal修飾子をつけると初期化後に値を変更出来なくなる
→定数と呼び、固定値を扱いたい時に使う

final int MAX_VALUE = 100
MAX_VALUE = 200 //コンパイルエラー

文字列の型

文字列はString型で参照型。参照型はデータそのものではなくメモリ上にあるデータの宛先情報を持つ
参照型は基本データ型とはデータの扱いが異なる

ローカル変数の型推論

varでローカル変数を宣言することで型推論ができる。ただし条件付き

  • 宣言時に代入する値で型が特定できる
  • nullは代入できない(コンパイルエラー)

型推論出来るところ

  • ブロック内のローカル変数宣言(メンバ変数には使用できない)
  • for文のインデックス
  • try-with-resource文のresource指定
  • ラムダ式の仮引数

配列

同じデータ型の値をまとめて管理する。参照型に属する。
基本データ型も参照型も配列で管理できる。

1次元配列

生成の手順

  1. 配列の宣言と生成
    int[] vers = new int[3]
    int vers[] = new int[3] //[]の位置は配列名の後でも可

  2. 要素への値の代入 vers[0] = 8; vers[1] = 9; vers[2] = 10;
    []内の数字を添え字と呼び、配列の位置を指定して代入やアクセスができる。(添え字は0から始まる)

    ↑の手順を一度に記述することもできる。
    int[] vers = {8,9,10}; int[] vers = new int[] {8,9,10}; //newした後も可

多次元配列

配列を扱う配列を宣言できる(理論上は何次元でも可)
2次元配列の例: int[][] array = new int[2][2]
多次元配列でも一度に宣言と初期化もできる
int[][] array = {{1,2},{1,2}}

配列の初期値表

初期値
int0
double0.0
booleanfalse
Stringnull
Objectnull

コマンドライン引数の利用

コマンドライン引数: コマンド実行する時にメソッドに受け渡す値
main()メソッドはString配列を引数として受け取る→プログラムで利用できる
main.javaの場合(ソースファイルモードでもできる)
java main hello java //main(実行クラス名)の後ろの文字列は引数としてプログラムに渡される

文字列操作

Stringクラス

Stringのオブジェクトはイミュータブル(不変)
→代入し直すとき、新たにオブジェクトをnewして格納している。

Stringクラスのメソッド

  • charAt(int index) = 指定したインデックスの1文字を返す
  • equals(Object object) = 文字列と引数で指定したオブジェクトの文字列を比較する(同値性の判定)
  • indexOf(String str) = strが出現する最初の位置を返す。ない場合は-1を返す
  • replace(CharSequence target, CharSequence replacement) = targetの文字列をreplacementに置き換える
  • substring(int begin, int end) = beginからend-1までの文字列を返す

テキストブロックの登場に合わせてメソッドが追加された

  • formatted = 書式設定
  • stripindent = 余分なインデント削除
  • translateEscapes = エスケープ文字が変換される

StringBuilderクラス

StringBuilderクラスから生成される文字列はミューダブル(可変)

StringBuilder sb1 = new StringBuilder(); //初期容量で16文字分確保(自動で拡張)
StringBuilder sb2 = new StringBuilder("hello"); //指定した文字列で初期化

主なメソッド

  • append() = 文字列追加
  • delete(start, end) = startからend-1文字まで削除
  • insert(offset, s) = offsetの位置に文字列sを挿入
  • replace(start, end, str) = startからend-1の文字列をstrに置き換え
  • capacity() = 現在の容量を返す
  • substring(start) = start以降の文字列を返す(Stringのメソッドとは少し違う)
  • toString() = Stringオブジェクトにして返す

上の4つは返り値がStringBuilder型


[JavaSilver対策]紫本第3章まとめ

2026-04-29 23:16

第3章

  • 演算子と優先順位
  • データの比較
  • 基本データ型の型変換
  • 基本データ型から参照型への型変換
  • ifによる分岐
  • switchによる分岐

演算子と優先順位

+=などの記号を演算子という
演算子には優先順位がある

算術演算子と炭鉱演算子

算術演算子は基本的な計算に使う演算子、演算の対象になる値や変数をオペランドという
+(足す), -(引く), *(掛ける), /(割る), %(剰余), ++(インクリメント), --(デクリメント)

代入演算子と複合代入演算子

= (代入演算子)
複合代入演算子は、算術演算子と代入演算子をあわせたもの。
a += b -> a = a + bのように算術演算子の結果を代入する。

関係演算子

2つの値の比較に使う。結果はbooleanで返ってくる
==(等しい), !=(等しくない), >(より大きい), >=(以上), <(より小さい), <=(以下)

論理演算子

2つの条件を評価し、結果をbooleanで返す
複数の条件判定が可能になる &(AND), &&(AND), |(OR), ||(OR), ^(XOR), !(NOT)


&と&&、|と||の違いは、&, |はオペランド全体を評価するのに対し、&&, ||は1つ目のオペランドで結果が確定する場合2つ目を評価しない
(これをショートサーキットと呼ぶ)

条件演算子

条件式 ? 式1 : 式2
条件演算子は条件によって異なる式を実行する。三項演算子などとも呼ばれる
条件式には結果がbooleanとなる式を指定し、結果がtrueなら式1、falseなら式2が実行される

データの比較

==!=は参照型にも使用できる。
==は参照型に使うときは、参照先が等しいかを比較する(同一性)

Stringクラスでの文字列の比較

文字列が等しいか(同値性)を比較する場合、equals()メソッドを使用する
その他にもいくつかの特徴がある

  • newしなくてもオブジェクト生成ができる
  • newせずに生成した文字列は使い回される(コンスタントプール)、intern()メソッドでも可能

intern()メソッド : コンスタントプールに同じ文字列がある場合はそれを返す、なかった場合はコンスタントプールに追加してから参照を返す

StringBuilderクラスはequalsメソッドが使えないのでtoStringしてから比較する

基本データ型の型変換

byte -> short -> int -> long -> float -> double ->...
右矢印の方向には暗黙的に型変換してくれる(ワイドニング)
逆向きは値が変わることがあるため、明示的な型変換が必要(ナローイング)
キャスト式
(変換したいデータ型) 変数やリテラル
また、booleanを除く基本データ型はchar型に変換できる。(¥u0000から¥uffffまでのunicode文字として解釈される)

基本データ型から参照型への型変換

基本データ型を参照型として扱うクラス(ラッパークラス)が用意されている。
ラッパークラス名は基本データ型の頭文字を大文字にしたものByteなど
変換は自動で行われる(オート(アン)ボクシング)ため、キャストのような仕組みはない

文字列の変換

  • 文字列から基本データ型への変換 ラッパークラス名.parseXxx(文字列) int i = Integer.parseInt("123") // 文字列からint
  • 文字列の1文字をcharに変換 文字列.charAt(インデックス) char c = "Duke".charAt(0) // 文字列のー番目(D)をcharに

ifによる分岐

if文

if(条件式){
    条件がtrueの場合の処理;
}

{}を省略して書くこともできる。その場合はif文直後の1文だけがif文の処理になる

if-else文

if(条件式){
    trueの場合の処理;
}else{
    falseの場合の処理;
}

falseの場合の処理をelseブロックに書く。複数記述でき、{}を省略すると直後の1文のみとなる

if-else if文

if(条件式1){
    条件式1がtrueの場合の処理;
}else if(条件式2){
    条件式2がtrueの場合の処理;
}else{
    すべての条件がfalseの場合の処理;
}

if文のネスト

if(){
    if(){

    }
}else{

}

また、equalsメソッドや論理演算子を使ってtrueの場合の処理をしたりすることもできる。

switchによる分岐

if文の他にswitch文でも分岐構造を実現できる

switch(式){
    case 定数1:
        式の評価結果が定数1に一致する場合の処理1;
        break; // switch文のブロックを抜ける記述、書き忘れると以下の処理が全て実行される
    case 定数2,3:
        式の評価結果が定数2か3に一致する場合の処理2;
        break;
    default:
        一致する評価がない場合の処理;// 省略可
        }

式にはbyte, short, int, char, Stringのほかに
列挙型(enum)や↑のラッパークラスが入る

:の代わりに->を使う方法がある、一致するcaseのみが実行されるのでbreak書き忘れなどによる意図しない実行が防げる

switch(式){
    case 定数 -> 式/ブロック/例外のスロー
    default -> 式/ブロック/例外のスロー
}

switch式

switchを式として扱う

int month = 12;
Srstem.out.println(
    switch(month){
        // case 定数 : 処理 yield 戻す値;
        case 12,1,2 : yield "Winter";
        // case 定数 -> 処理 戻す値;
        case 12,1,2 -> "Winter"
        default yield "N/A"
        // default必須(返り値が必要なため)
    }
    );

「3章の8つの引っ掛けポイント」

  1. 小数点 = doubleデフォ (f サフィックス)
  2. 文字列連結 = + のみ
  3. String/StringBuilder比較 = toString()必須
  4. ショートサーキット = && と &
  5. NOT反転 = !で条件反転
  6. if-else if = 順序大事
  7. switch case = final定数のみ
  8. switch型 = long/boolean不可

[JavaSilver対策]紫本第4章まとめ

2026-04-29 23:16

繰り返しと制御文の組み合わせ

  • whileによる繰り返し
  • forによる繰り返し
  • 制御文の組み合わせ
  • 繰り返しの制御

whileによる繰り返し

while文は条件式を1つもち、条件がtrueの間繰り返す

while(条件式){
    繰り返す処理;
}

条件式の例

while(a != 20){} // aが20と等しくない間
while(a >= 5 && a <= 30){} // aが5以上30以下の間
while(a > 0){} // aが0より大きい間
while(a >= 0) // aが0以上の間(0も含む)

条件式によって実行される回数や出力されるタイミングが異なってくる

do-while文

do{
    繰り返す処理;
}while(条件式);

最初にdoをつけることでブロック内の処理が必ず1度は行われる(条件判定の前に処理があるため)
また、whileのあとに;をつける点がwhileとちがう
do-whileもwhileも繰り返す処理が1文だけの場合、ブロック{}を省略できる

forによる繰り返し

Javaでは基本のfor文と拡張for文が用意されている

for文

for(初期化式; 条件式; 更新式){
    繰り返す処理;
}
  • 初期化式 = for文内で使う変数の初期化i = 0などint i = 0, j = 0のように複数記述もできる。(変数宣言と同様に型は複数記述できない)
  • 条件式 = 結果がboolean型となる式で繰り返しの条件を書くi < 5など(varも使える)
  • 更新式 = 初期化式で宣言した変数の値の増減i++など

条件式の結果がtrueの間処理が繰り返される。
また、↑の式は省略できるが、セミコロンは省略できないfor(; i > 5; i++)などと書く

拡張for文

配列やコレクションなどの全要素に対して、最初から順番に処理を行う場合に使用する(foreach的な?)

for(要素型の変数宣言 : 式){
    繰り返す処理;
}
  • 要素型の変数宣言 = 式の要素を受け取るための変数
  • 式 = 配列やIterableインターフェースを実装したクラス(コレクションフレームワーク)

制御文の組み合わせ

以前までに使用してきた制御文は組み合わせて使用できる

制御文のネストと変数のスコープ

繰り返し文や条件分岐はネストして使用することができる。
その際に変数が使用できる範囲は宣言したブロック内に限られる。

繰り返し文のネスト

繰り返し文をネストした構造を多重ループという。

繰り返しの制御

無限ループ

無限ループは意図的に起こせる

while(true){} //条件式にtrue
for(;;){} // セミコロンのみ記述
// while(false){} はコンパイルエラー

無限ループは処理の中でif文などを使ってループを抜ける

break文

switchではcaseを抜けるのに使った。
繰り返し文の中で使うと、繰り返し処理を中断してループを抜けたあとの処理を行う。

continue文

continueは繰り返し文を抜けるのではなく、実行中の残りの繰り返し処理のみスキップする。
(continueすると処理が繰り返し文の最初に戻る)

ラベルによる制御

ラベル名:でラベルを設定できる。 breakやcontinueともにラベルを設定できる

  • continue ラベル = ラベルの範囲の後続処理をスキップする
  • break ラベル = ラベルの配下の繰り返しを抜ける

紫本第4章見落としまとめ

2026-04-29 23:16

第4章「繰り返しと制御文の組み合わせ」よくある見落としパターン

📌 はじめに

Day 12で章末問題を解いて気づいた、試験本番でよく引っかかる7つのパターンをまとめました。

これらは「理解していても見落とす」ものばかり。本番試験までに何度も読み返して、読み落としクセ を直しましょう!


パターン1️⃣: do-while文の後のセミコロン

❌ よくある間違い

do {
    System.out.print("*");
} while(false)  // ← セミコロン忘れ!

✅ 正解

do {
    System.out.print("*");
} while(false);  // ← セミコロン必須!

💡 ポイント

  • do-while文の唯一の構文ルール: while()の後に必ずセミコロン
  • while文には要らないが、do-whileには必須
  • try-catch-finallyのfinallyと同じ感覚で間違える

🎯 試験対策

見直しの時に「do-while」が出たら、必ずセミコロン確認


パターン2️⃣: 条件式の中の演算子を見落とし

❌ よくある間違い

int count = array.length;
while(count > 1) {
    System.out.println(array[count]);  // ← "- 1" を見落とした!
}

✅ 正解

int count = array.length;
while(count > 1) {
    count--;  // ← 正確には「array[--count]」で先置デクリメント
    System.out.println(array[count]);
}

💡 ポイント

  • 条件式は「1文字ずつ」読むつもりで読む
  • a = x - b のような「-」を見落としやすい
  • 複雑な式は「全文を読む」まで目を離さない

🎯 試験対策

条件式が複雑なら、式の各要素を指で指しながら読む


パターン3️⃣: 拡張for文の変数は暗黙的にfinal

❌ よくある間違い

for(String s : array) {
    s += "x";  // ← コンパイルエラー!
}

✅ 正解(変更できない)

// 拡張for文の変数は暗黙的にfinal
// つまり「s = ...」も「s += ...」もできない
for(String s : array) {
    System.out.println(s);  // ← 読み取りのみOK
}

💡 ポイント

// これは明示的にfinal指定
for(final String s : array) {
    s += "x";  // ← エラー(上の暗黙的なのと同じ)
}
  • 拡張for文の変数は自動的にfinal属性を持つ
  • +=, -=, ++ などの再代入は全てNG
  • 読み取りと使用のみ可能

🎯 試験対策

拡張for文が出たら、「この変数はfinalか?」を必ずチェック


パターン4️⃣: do-while vs while のコンパイル判定

❌ よくある間違い

// この2つは同じコンパイル結果だと思う
do { System.out.print("*"); } while(false);
while(false) System.out.print("*");

✅ 正解

// do-while: OK ✅ (1回は実行される)
do {
    System.out.print("*");
} while(false);

// 普通のwhile: NG ❌ (コンパイルエラー)
while(false)
    System.out.print("*");  // 到達不可コード!

// while(1 == 2)も同じ NG ❌

💡 ポイント

条件式do-whilewhile
false✅ OK❌ エラー
1 == 2❌ エラー❌ エラー
  • do-while: doの処理は必ず1回実行 → while(false)でもOK
  • while: 条件判定が先 → falseなら到達不可コード = コンパイルエラー
  • ただしdo-whileでもリテラルfalse扱いのリテラル比較はエラー

🎯 試験対策

「do-whileでコンパイルエラーか?」を聞かれたら、リテラル判定が必要


パターン5️⃣: 多次元配列の拡張for文の

❌ よくある間違い

String[][] matrix = {
    {"A", "B"},
    {"C", "D"}
};

for(String s : matrix) {  // ← 間違い! sは String[] です!
    System.out.println(s);
}

✅ 正解

// 1段階目: 配列を取り出す
for(String[] row : matrix) {
    System.out.println(row);  // [A, B] などが出力
}

// 2段階目: 配列の中身を取り出す
for(String[] row : matrix) {
    for(String s : row) {
        System.out.println(s);  // A, B, C, D
    }
}

💡 ポイント

// 1次元配列なら
for(String s : array)       // String を取り出す

// 2次元配列なら
for(String[] row : array)   // String[] を取り出す
for(String s : row)         // String を取り出す
  • 多次元配列では、1段階ずつ型を落とす
  • 「配列の配列」なので、1回目は配列型

🎯 試験対策

多次元配列の拡張forが出たら、型を1段階落とす


パターン6️⃣: スコープ外の変数アクセス

❌ よくある間違い

for(int i = 0; i < 5; i++) {
    // iはここだけ有効
}
System.out.println(i);  // ❌ スコープ外! コンパイルエラー

✅ 正解

int i;  // forの外で宣言
for(i = 0; i < 5; i++) {
    // iはここでも有効
}
System.out.println(i);  // ✅ OK (i = 5)

💡 ポイント

  • 変数は宣言されたブロック内でのみ有効
  • if, for, while のブロック内で宣言した変数は、そのブロックを出たらアクセス不可
  • 外から参照したいなら、ブロックの外で宣言

🎯 試験対策

ループの後で変数を使う問題が出たら、変数の宣言位置をチェック


パターン7️⃣: ラベル付きbreakの動作

❌ よくある間違い

outer: for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(i == 1) break;  // ← 内側のループだけ抜ける
    }
}

✅ 正解

outer: for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(i == 1) break outer;  // ← 外側のループまで全部抜ける!
    }
}

💡 ポイント

// 実行フロー:
i=0, j=0 → 出力
i=0, j=1 → 出力
i=0, j=2 → 出力
i=1, j=0 → break outer で完全終了
// i=1,j=1 以降は実行されない!
  • break: 最も内側のループだけ抜ける
  • break ラベル: ラベルまで遡って、そこのループを抜ける
  • continue も同じ仕様

🎯 試験対策

ラベル付きbreakが出たら、どこまで抜けるかをトレース


📋 見落とし対策チェックリスト

解答する前に、必ずこれらを確認:

  •  do-while の後のセミコロン ← 書いてる?
  •  条件式は全て読んだ ← 「-b」のような部分を見落とさない
  •  拡張for文の変数はfinal ← 再代入してないか?
  •  do-while と while の判定 ← リテラルfalse判定してる?
  •  多次元配列の型 ← 1段階ずつ落としてる?
  •  変数のスコープ ← ブロック外でアクセスしてないか?
  •  ラベル付きbreak ← どこまで抜けるかトレース?

💪 最後に

これらのパターンは、理解していても見落とす ものばかり。

大事なのは:

  1. 実装で理解する
  2. 問題文を徹底的に読む ← 細部の見落としをなくす
  3. 何度も繰り返す ← パターンを脳に染み込ませる

本番試験までに、これら7つのパターンが 自動的に目に入る 状態にしましょう!

頑張ってください! 🚀✨


[JavaSilver対策]個人的見落とされやすいポイント TOP 5

2026-04-29 23:16

テキストブロックの改行コード (問題1)

"java"

""" 
java 
"""

は異なる 見落としやすい!

コンストラクタにvoidは禁止 (問題10, 12)

void Item() ← これはコンストラクタではなくメソッド 頻出トラップ問題

staticメソッドからのインスタンスメソッド呼び出し不可 (問題16)

this.も使えない コンパイルエラー直結

メソッド引数にvarは使用不可 (問題33)

これも見抜く必要あり コンパイルエラー

配列宣言のルール (問題11)

new char[3][3]{{...}} はNG 左辺に要素数、右辺に初期値を同時に書かない


[JavaSilver対策]直前の対策

2026-04-29 23:16

1度落ちてしまったので再受験する。直前の対策ように個人的に間違いやすいところをあげていく

復習用

オーバーライドとオーバーロード

  • オーバーライド : メソッドを再定義すること、メソッドのシグネチャが同一・戻り値型が同一かサブクラス型・アクセス修飾子が同じか緩い
  • オーバーロード : メソッドを多重定義すること、メソッド名は同じで、引数の数・型・順番を変える

メソッド、フィールドのアクセス

  • メソッドはインスタンスの型で決まる
    A foo = new foo(); foo.x() //xはfoo型
  • メンバ変数は宣言する型で決まる
    A foo = new foo(); foo.num //numはA型

instanceOf

クラス名やインターフェース名をつけると指定したオブジェクトが継承・実装関係にあるか調べる。右辺に変数宣言が書いてあったらパターンマッチングになる。instanceOfがtrueのときに変数にオブジェクトを代入する

equals()

  • 文字列の値が等しいか判定する
  • オブジェクトにもequals()は存在する。==と同じ働きをする
  • 引数がnullの場合は必ずfalseを返す(ぬるぽにならない)null.equals()はnullにメソッド呼び出しているのでぬるぽだけど

sealed継承

  • sealed/non-sealed/finalのいずれか必須

final

  • インターフェースやabstractの実装や継承が前提となっているクラスはfinalできない

throws throw

  • throwsは例外を投げる宣言→メソッドの呼び出しもとに処理を任せる(外すとコンパイルエラーになるときはチェック例外)
  • throwは例外を投げること

break continue

  • breakは最も近いループを抜ける、ラベルの外側にも抜ける
  • continueは次のループに行く
  • switch文の中のbreakはswitchの外に行くだけ(switchのbreakとなる)

変数の初期化

  • ローカル変数は自動初期化されない
  • 未初期化の変数を使用 = コンパイルエラー
  • フィールド変数は自動初期化される(int=0, boolean=false, 参照型=null)

インターフェースのメソッド修飾子

  • 抽象メソッド: public または package-private(private不可)
  • defaultメソッド: private可
  • staticメソッド: private可
  • インターフェースメソッドの衝突 → オーバーライドして明記必要

try-with-resources

  • リソース変数は実質的final = 再代入不可
  • AutoCloseableを実装している必要あり
  • 複数リソースはセミコロンで区切る

キャスト

  • ダウンキャスト: instanceofでチェック推奨
  • キャスト先のインスタンスが違う → ClassCastException(実行時エラー)
  • キャスト演算子は括弧で囲む: ((A)b).test()

switch式

  • yieldで値を返す: case x: yield y;
  • ブロック内で値を返すときに使用

varとジェネリクス

  • varでArrayList宣言時、ジェネリクスの型指定必須
  • var list = new ArrayList<>(); NG
  • var list = new ArrayList<String>(); OK
  • 普段の宣言では、ローカル変数のみ・null禁止・初期化必須

コンストラクタ

  • this(), super()はコンストラクタの最初にかく
  • 両方一緒には使えない

static

  • インスタンス生成がなくても使えるので->static以外の変数、メソッドは使えない

たまにbool(javaにこの宣言はない)とbooleanがある。引っかからないように

これで落ちたらブロンズから再出発すればいいや、と。気楽に


[JavaGold対策]紫本1章コレクションとジェネリクス

2026-04-29 23:16

懲りずに今度はゴールド

紫本1章コレクションとジェネリクス

  • 基本データ型を参照型として扱う際にラッパークラスを使用する
  • オートボクシング、アンボクシングが自動で行うこともできる
  • ジェネリクス: 型パラメーターを定義することで使用する際に型を決定できる
  • ダイヤモンド演算子: 型推論ができるようになった
  • コレクションフレームワーク: java.utilパッケージに属するオブジェクトのグループを操作するためのアーキテクチャ
  • コレクションフレームワークはインターフェースの実装クラスで、多岐にわたる。
  • コレクションで扱う要素は、コレクションフレームワークと実装クラスがジェネリッククラスなので、基本データ型は扱えない

コレクションインターフェース

  • List インターフェース: インデックスで順序付けして要素を管理、要素の追加・取得・変更・削除・検索など可能
  • Set インターフェース: 重複要素を持たないコレクション、nullも一つだけしか保持できない
  • Queue/Dequqインターフェース: QueueはFIFOで要素を管理する。先にキューに追加した要素から取得を行うための機能が備わっている、Dequeは両端から要素の追加や削除などを行える
  • Map<K, V>インターフェース: マップの要素は重複のない一意のキーと値のペア

コレクションの変更

  • コンストラクタを使用して生成したコレクションは変更可能
  • of()で生成したコレクションは変更不可
  • Arrays.asList()で生成したリストは、固定サイズの配列(要素の変更はできても、サイズ変更は不可)

[JavaGold対策]紫本2章関数型インターフェースとラムダ式

2026-04-29 23:16

紫本2章 関数型インターフェースとラムダ式

  • クラス内にはネストクラスという、別のクラスを定義することができる→強力なカプセル化と情報隠蔽ができる
  • 取り囲む外側のクラスをエンクロージングクラスという
クラスの種類関連付けインスタンス化に必要なこと
内部クラスエンクロージングクラスのインスタンスエンクロージングクラスのインスタンス化
staticなネストクラスエンクロージングクラス自体エンクロージングクラスのインスタンス化不要
  • @FunctionalInterfaceアノテーションは、関数型インターフェースにつける、関数型インターフェースは一個しかメソッドをもてない!
  • 特定のブロック内で一時的に使用する目的で作成するクラスをローカルクラスという
  • 非staticなネストクラスとなる→アクセス修飾子の指定やstaticは不可

ローカルクラスの特徴

  • 修飾子はabstract/finalが指定可能
  • エンクロージングクラスのメンバにアクセス可能
  • 外側のブロックのfinal,実質的finalなローカル変数にアクセス可能

無名クラスの特徴

  • 一時的に参照型の値が必要な場合に、その場でクラスの作成とインスタンス化を行う
  • クラス名を持たないため、サブクラスか、インターフェースの実装クラスとして作成する

ラムダ式

  • 無名クラスを完結に記述できるようにしたもの
  • 関数型インターフェースからオブジェクト生成までを完結に記述する→コンパイラが関数型インターフェースの型推論ができる場所で使える
  • 構文(引数リスト) -> {メソッドの処理}

メソッド参照

  • 関数型インターフェースの抽象メソッドの実装が、既存のメソッドを呼び出すだけのことがある
  • ラムダ式の代わりにメソッド参照を利用できる
  • 構文クラス(参照変数)名::メソッド名

[JavaGold対策]紫本3章 JavaストリームAPI

2026-05-03 22:18

  • java.util.streamパッケージのこと。データをパイプラインで処理する。
  • ストリームパイプラインを構成して処理を行う

ストリームパイプラインの要素

  • データソースからストリームを形成
  • 上に続く0個以上の中間操作(遅延操作!終端操作が実行されるまで実際には実行されない)
  • パイプラインの最後で1つの終端操作
  • 終端操作によって処理が適用される。終端処理を記述しないとストリームの処理は実行されない(コンパイルエラーにはならない)

ストリームの生成

  • インターフェースやクラスで提供される

ストリームの中間操作

  • 中間操作のメソッドも提供されている。多くは関数型インターフェースを引数に受け取る

要素のフィルタ

  • filter()はストリームの全ての要素を調べてtrueの要素を返す
  • dropWhile()は最初にfalseが現れた以降の要素を返す
  • takeWhile()は先頭から連続してtrueの間の要素を返す

ストリームの終端操作

  • java.util.OptionalクラスはTをラップするコンテナオブジェクトとして使用する
  • nullチェックのボイラープレートコードなしでもヌルポを避けることができる

終端操作のメソッド

主に以下の目的でメソッドを使用する

  • 要素の探索: findAny(),findFirst(),allMatch()など、ショートサーキットな終端操作であり、結果が確定すると処理を終了する
  • 要素の集計: count(),max(),min()など
  • 要素の蓄積: toList(),toArray()
  • 要素のリダクション: reduce(),collect()、リダクションとはストリームの要素を一つに集約する処理。広義では上2つもリダクション

可変リダクション操作

Collector<T,A,R>インターフェースとCollectorクラス

  • Collect()は可変リダクションを行うメソッド、ストリーム要素を可変コンテナに蓄積して処理を行った結果を返す

Java Goldを7月末までに取りたい

2026-06-02 22:32

Java Goldを7月末までに取りたい

Java Silverを取ってから少し時間が経ったので、次はJava Goldを取りにいきます。

目標は2026年7月末まで。 かなり余裕があるというよりは、ちゃんとやらないと普通に落ちるくらいの期間感だと思っています。

なぜJava Goldを取るのか

今の自分はJavaとSpring Bootを個人開発で使っていて、ブログもJava 23 / Spring Boot 3で動かしています。

ただ、実務ではCOBOLが中心なので、Javaを「業務で毎日書いている人」と比べると、どうしても経験値の差があります。

その差を少しでも埋めるために、資格という形でJavaの基礎から応用までをもう一度固めたいです。

Java Silverは取っていますが、Silverの範囲でも忘れているところは普通にあります。 特に、細かい文法やOOPの挙動は「なんとなく分かる」だと試験では落とされるので、Goldに入る前に土台から戻します。

Goldで固めたいところ

Java Goldは、Silverよりも「実際にJavaで開発しているなら知っておきたいこと」が多い印象です。

特に固めたいのはこのあたりです。

  • コレクション
  • ジェネリクス
  • Stream API
  • 例外処理
  • ファイルI/O、NIO.2
  • JDBC
  • モジュール
  • 並行処理
  • ローカライズ
  • アノテーション

Spring Bootを書いていると、フレームワークがかなり面倒を見てくれます。 それは便利なのですが、裏側のJavaの仕様を理解しないまま使っている部分もあります。

例えばStreamは普段から使いますが、中間操作と終端操作、遅延評価、parallelStreamの注意点まで説明できるかというと、まだ怪しいです。

ジェネリクスも、使う分にはなんとなく書けても、ワイルドカードや型推論の細かいところで問題にされると詰まりそうです。

このへんを「雰囲気で使える」から「理由を説明できる」に変えたいです。

進め方

7月末までのざっくりした流れはこうします。

最初は基礎の再起動。 変数、型、演算子、制御構文、クラス、インスタンス、コンストラクタ、static、アクセス修飾子あたりを短期間で戻します。

次にOOPと例外。 継承、オーバーライド、ポリモーフィズム、抽象クラス、インターフェース、try-with-resourcesあたりを固めます。

そのあと、コレクション、ジェネリクス、Streamを重点的にやります。 ここはGoldでも実務でも大事なので、問題を解くだけで終わらせず、コードを書いて挙動を確認します。

後半はGoldらしい論点をまとめて潰します。 モジュール、ローカライズ、アノテーション、ファイルI/O、JDBC、並行処理です。

最後は問題演習中心。 黒本を回して、間違えた問題をひたすら潰します。

教材

メインは紫本と黒本でいきます。

紫本は、章の全体像をつかむために使います。 Silverの知識を戻すときや、理解があいまいな単元を読み直す用途です。

黒本は、問題演習の中心にします。 解説を読むだけで終わらせず、間違えた問題は「なぜそうなるのか」を1行でもいいのでメモします。

動画教材は、必要ならpaizaを使う予定です。 文字だけだと入りづらいところ、特に例外、Stream、JDBCあたりを補助的に見ます。

あとはOracle公式の試験範囲とAPIドキュメントも確認します。 資格試験なので、最終的には公式の範囲に戻るのが一番安全です。

毎日のルーティン

毎日長時間やるというより、短くても毎日触ることを優先します。

  • 15分: 前日の復習
  • 30分: 新しい論点を1つ進める
  • 30分: 問題演習
  • 10分: 間違えた理由をメモする

これくらいなら平日でもなんとか回せるはず。

一番大事なのは、問題を「見たことある」で終わらせないことだと思っています。 選択肢を覚えるのではなく、なぜその選択肢が正しいのか、なぜ他が間違っているのかを説明できるようにしたいです。

合格したらどうしたいか

Java Goldを取ったから急に実務経験が増えるわけではありません。

ただ、Javaをちゃんと勉強していることの証明にはなりますし、転職活動でも個人開発でも、自分の土台として効いてくると思っています。

Spring Bootでアプリを作るときも、フレームワークの便利さに乗るだけではなく、Java本体の仕様を分かったうえで書けるようになりたいです。

7月末まで、まずは毎日進めます。 途中で進捗や詰まったところも、できれば記事に残していきたいです。


Java Goldを7月末までに取りたい ← 諦めました

2026-07-19 01:02

なぜなら転職の必要がなくなったから。

そもそもJavaの勉強に力を入れていた理由

  • オブジェクト指向の基本を身につけたかった
  • 少し前まで職場でCOBOLを中心に扱っており、キャリアの停滞感を持っていた
  • ->要は転職活動のダシにして、モダン環境に行ってエンジニアとして強くなりたかった。

今はどうしている?

  • 社内でモダン寄りな部署に異動できることがわかり、現在その部署に所属
  • 主にC#を使っている、ASP.NET/Blazorのweb環境で開発をしている

まとめる

転職活動としてJavaの資格とか勉強してきましたが、これからはC#メインになりそうです。 JavaはやるかもしれないしClaudeにお任せしちゃうかもしれない、資格取得はとりあえずお休みです。 見てる人がいるかわからないが発信は続けます、引き続きよろしくお願いします。