-
Javaのprotectedとデフォルトアクセス修飾子の違いを徹底解説
Javaにおけるprotectedアクセス修飾子は、同じパッケージ内で可視であることに加え、サブクラスからもアクセス可能です。一方、デフォルト(修飾子なし)はパッケージレベルのアクセス修飾子であり、同じパッケージ内でのみ可視となります。protectedアクセス修飾子とはprotectedは、同じパッケージ内ではpublicのように振る舞い、パッケージ外ではprivateのように振る舞います。protectedは、サブクラスのオブジェクトに対しては、パッケージ外でもpublicのように振る舞います。protectedは、トップレベルのクラスやインターフェースには適用できません。スーパークラスで
-
JavaでArithmeticException(非検査例外)を処理する方法を徹底解説
java.lang.ArithmeticExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。実際の開発で最もよく目にするのは「java.lang.ArithmeticException: / by zero」というエラーで、これは2つの数値の除算を行った際に分母がゼロになると発生します。なお、ArithmeticExceptionのオブジェクトはJVMによって自動的に生成されることがあります。 例1:ArithmeticExceptionが発生するコード public class ArithmeticExceptionTest { pu
-
JavaでNumberFormatException(非検査例外)を処理する方法をわかりやすく解説
NumberFormatExceptionは、parseXXX()系のメソッドが文字列を数値に変換できなかった場合にスローされる非検査例外(unchecked exception)です。この例外はコンパイル時に強制されないため、開発者が適切に対処しないと実行時にプログラムが異常終了する原因となります。java.langパッケージのクラスには、NumberFormatExceptionをスローする可能性のあるメソッドやコンストラクタが多数存在します。代表的なものは以下の通りです。public static int parseInt(String s) throws NumberFormatExc
-
JavaのArrayStoreException(非チェック例外)とは?発生原因とtry-catchでの対処法を解説
java.lang.ArrayStoreExceptionは非チェック例外(unchecked exception)の一種です。ある型のオブジェクトを、別の型のオブジェクトを格納するために作られた配列に保存しようとした際に発生します。 よく見られる例が「java.lang.ArrayStoreException: java.lang.Integer」というエラーです。これは、String型の配列やFloat型の配列など、異なる型の配列に対してInteger(整数)を格納しようとしたときにスローされます。 発生例1:ArrayStoreExceptionが起こるコード public class
-
【Java】メソッドローカル内部クラスはローカルfinal変数にアクセスできるのか?
結論から言うと、メソッドローカル内部クラス(メソッド内ローカルクラス)からローカルfinal変数にアクセスすることは可能です。これは、final変数がヒープ領域に格納され、メソッドローカル内部クラスのオブジェクトが生存している間は値が保持され続けるためです。 メソッドローカル内部クラスとは ローカル内部クラスのインスタンスは、メソッドの引数として渡したり、戻り値として返したりすることもでき、有効なスコープ内であれば自由に利用できます。 メソッドローカル内部クラスの唯一の制限は、外部のローカル変数にアクセスする際、その変数が final として宣言されている必要があるという点です。 ローカル変
-
Javaのトップレベルクラスはprivateやprotectedで宣言できる?アクセス修飾子のルールを解説
結論から言うと、トップレベルクラス(最上位クラス)をprivateやprotectedとして宣言することはできません。指定できるのはpublic、あるいは修飾子なし(デフォルトアクセス)のどちらかだけです。修飾子を付けなかった場合、そのクラスはデフォルト(パッケージプライベート)のアクセスレベルを持つことになります。 基本構文 // トップレベルクラスの例 public class TopLevelClassTest { // クラス本体 } 押さえておきたいポイント トップレベルクラスにprivateを付けると、コンパイラは「modifier private not allowed
-
Javaでtry-catchブロックの中にさらにtry-catchブロックを宣言することはできる?
はい、可能です。Javaでは、try-catchブロックの中に別のtry-catchブロックを宣言することができます。これを「ネストされたtry-catchブロック」と呼びます。ネストされたtry-catchブロックの仕組み内側のtry文が特定の例外に対して対応するcatch文を持っていない場合、制御は次のtry文のcatchハンドラに移され、一致するcatch文が探されます。この処理は、いずれかのcatch文が成功するまで、あるいはネストされたすべてのtry文が終了するまで繰り返されます。どのcatch文とも一致しなかった場合、最終的にJavaランタイムシステムが例外を処理します。ネストされ
-
Javaのlengthとlength()の違いを徹底解説!正しい使い分けのポイント
Javaには、配列のサイズを取得するlengthと、文字列の長さを取得するlength()という、名前がよく似た2つの仕組みが存在します。初心者の方は混同しがちですが、この2つは本質的に異なるものです。lengthは配列のインスタンス変数(フィールド)である一方、length()はStringクラスのメソッドです。それぞれの特徴と使い方を詳しく見ていきましょう。 length:配列の長さを表すフィールド 配列はオブジェクトであり、同じ型の値を固定された個数だけ格納します。 配列のlength変数は配列の長さ、すなわち配列に格納されている要素数を返します。 配列は一度初期化するとその長さを後か
-
Javaのネストクラス(内部クラス)とは?静的ネストクラスと非静的ネストクラスの違いを解説
Javaでは、あるクラスの中に別のクラスを定義することができます。このようなクラスはネストクラス(Nested Class)と呼ばれます。アクセス修飾子については、内部クラスには private、public、protected、デフォルト(指定なし)のいずれも使用できますが、外部クラス(トップレベルクラス)に使用できるのは public またはデフォルトのみです。Javaで定義できるネストクラスには、大きく分けて以下の2種類があります。静的ネストクラス(Static Nested Class)非静的ネストクラス(Non-Static Nested Class / 内部クラス)静的ネストクラス
-
ClassCastExceptionとは?Javaでスローされる条件と発生例を解説
ClassCastExceptionとはjava.lang.ClassCastExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。プログラムの実行中に、あるクラス型のオブジェクトを互換性のない別のクラス型へ変換(キャスト)しようとした際に発生します。非検査例外のため、コンパイル時には検出されず、実行時に初めてスローされる点に注意が必要です。ClassCastExceptionがスローされる主なケース親クラスのオブジェクトを子クラス型にキャストした場合:実際のオブジェクトが親クラスのインスタンスであるにもかかわらず、子クラス型へのダウンキャストを
-
Javaで例外をスローするメソッドをオーバーライドする際に守るべきルールとは?
メソッドオーバーライド時の例外に関する基本ルールJavaでは、例外をスローするメソッドをオーバーライドする際に、いくつかの重要なルールに従う必要があります。親クラス(スーパークラス)と子クラス(サブクラス)の間でthrows句の扱いを誤るとコンパイルエラーが発生するため、以下のルールをしっかり理解しておきましょう。ルール1:親クラスのメソッドが例外をスローしない場合親クラスのメソッドが例外を一切スローしない場合、子クラスでオーバーライドしたメソッドはチェック例外(検査例外)をスローできません。ただし、非チェック例外(非検査例外)であれば自由にスローすることが可能です。class Parent
-
JavaでStringIndexOutOfBoundsException(非検査例外)を処理する方法
StringIndexOutOfBoundsExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。文字列は文字の集合体であり、Stringオブジェクトが持つ有効なインデックス範囲は [0、文字列の長さ] です。実際の文字列の範囲を超えて文字へアクセスしようとした場合に、この例外が発生します。例1:例外が発生するケースpublic class StringDemo { public static void main(String[] args) { String str = Welcome to Tutorials Poin
-
Javaでスーパークラスのfinalメソッドをオーバーライドするとどうなる?エラーの原因とルールを解説
Javaにおいて、スーパークラス(親クラス)でfinalキーワードを付けて宣言されたメソッドは、サブクラス(子クラス)からオーバーライドすることができません。もしfinalメソッドをオーバーライドしようとすると、コンパイル時にエラーが発生します。これは、final修飾子が「そのメソッドの実装を変更させない」という意図を持っているためです。設計上、継承先での挙動変更を防ぎたい場合にfinalメソッドが使われます。メソッドオーバーライドを実装するためのルールオーバーライドするメソッドの宣言(メソッド名・引数・戻り値の型など)は、オーバーライド対象のメソッドと同一である必要があります。サブクラスは、
-
Javaでコンストラクターをprivate宣言することはできる?条件とシングルトンパターンでの活用例
はい、Javaではコンストラクターを private として宣言することができます。コンストラクターをprivateにすると、クラスの外部からそのクラスのインスタンス(オブジェクト)を直接生成できなくなります。この性質を利用する代表的なデザインパターンが、シングルトンパターン(Singleton Design Pattern)です。プライベートコンストラクターの主な特徴・条件privateコンストラクターを持つクラスは継承(サブクラス化)できません。クラスの外部からインスタンスを生成できません。クラス内に定数(定数メソッド)しか持たない場合に有効です。すべてのメソッドがstaticである場合に
-
Javaではクラス名と同じ名前のメソッドを定義できるのか?
はい、Javaではクラス名と同じ名前のメソッドを定義することが可能です。コンパイル時にも実行時にもエラーは発生しません。ただし、Javaのコーディング規約の観点からは推奨されていません。その理由は、Javaでは通常コンストラクタ名は必ずクラス名と同じになるため、同名のメソッドが存在するとコードの可読性や保守性を損ない、混乱を招く可能性があるからです。 サンプルコード public class MethodNameTest { private String str = "Welcome to TutorialsPoint"; public void Met
-
Javaの静的ブロックとコンストラクターの違いとは?実行タイミングと使い分けを徹底解説
Javaには、クラスやオブジェクトの初期化に関わる仕組みとして「静的ブロック(staticブロック)」と「コンストラクター」があります。どちらも初期化処理を記述するために使われますが、実行されるタイミングや役割が大きく異なります。本記事では、それぞれの特徴と違いをコード例とともに詳しく解説します。 静的ブロック(staticブロック)とは 静的ブロックはクラスがロードされるタイミングで実行されます。 main()メソッドよりも先に実行されます。 静的ブロックには名前がなく、引数や戻り値も持ちません。 クラスロード時に一度だけ実行したい処理(静的変数の初期化など)は、静的ブロック内に記述しま
-
Javaのenum(列挙型)は拡張・継承できるのか?理由と代替手段を解説
結論:Javaでenumを拡張することはできないいいえ、Javaではenum(列挙型)を拡張(継承)することはできません。Javaのenumは、コンパイル時に暗黙的にjava.lang.Enumクラスを継承します。Javaは単一継承を採用している言語であるため、すでにEnumクラスを継承しているenumが、さらに別のクラスを継承することは構文的に不可能なのです。java.lang.Enumクラスの宣言実際に、JDKにおけるEnumクラスの宣言は以下のようになっています。public abstract class Enum<E extends Enum<E>>
-
Javaのmainメソッドは「static public void main()」の順序で書ける?修飾子の並び順を解説
はい、可能です。Javaでは public static void main() の順序を static public void main() に変更しても、コンパイル時にも実行時にもエラーは発生しません。Javaではアクセス修飾子(public、private、protected など)は任意の順序で宣言できます。ルールとしては、メソッド名が最後に来ること、戻り値の型がその直前に来ることが決まっており、それ以外の部分(static やアクセス修飾子など)の順序は自由に選べます。ただし、Javaのコーディング規約では、可読性の観点からアクセス修飾子を先頭に置くことが推奨されています。そのため、
-
JavaのStringクラスintern()メソッドとは?文字列プールの仕組みとメモリ節約の使いどころを解説
JavaのStringクラスが提供するintern()メソッドは、文字列の重複問題に対処するための強力な仕組みです。重複した文字列インスタンスが消費するメモリを大幅に節約できます。ここで「重複した文字列」とは、内容は同じでも異なるメモリ位置に存在する文字列を指します。 文字列プール(String Pool)の仕組み JVMはパフォーマンス向上のため、文字列リテラル専用の独立したヒープ領域(文字列プール)を管理しています。文字列リテラルを宣言すると、その値はまずこのプールに登録されます。その後、別の変数に同じリテラル値を代入した場合には、新しくオブジェクトを生成してヒープに格納するのではなく、プ
-
Javaで静的コンストラクターは定義できる?結論と正しい代替方法を解説
結論:Javaでは静的コンストラクターを定義できませんいいえ、Javaでは静的コンストラクター(static constructor)を定義することはできません。 staticキーワードを付けてコンストラクターを定義しようとすると、コンパイル時エラーが発生します。そもそも「static」はクラスレベルのメンバーであることを意味します。一方、コンストラクターはインスタンス変数に初期値を代入するために存在するものです。このように、staticとコンストラクターは役割が異なり、互いに対立する概念なのです。そのため、初期化の目的に応じて次のように使い分けるのがJavaの正しい作法です。インスタンス変数