なぜStringクラスはJavaで不変またはfinalなのですか?
文字列が不変であることは、オブジェクト自体を変更できないことを意味しますが、オブジェクトへの参照は変更できます。文字列は、他の人が文字列を拡張してその不変性を破壊できないように、最終的に作成されます。
- セキュリティ パラメータは通常、ネットワーク接続、データベース接続URL、ユーザー名/パスワードなどで文字列として表されます。可変である場合、これらのパラメータは簡単に変更できます。
- 同期と同時実行 Stringを不変にすると、自動的にスレッドセーフになり、同期の問題が解決されます。
- キャッシュ コンパイラがStringオブジェクトを最適化する場合、2つのオブジェクトが同じ値(a="test"およびb="test")であるため、必要な文字列オブジェクトは1つだけであるように見えます(aとbの両方で、これら2つは同じオブジェクトに)。
- クラスの読み込み 文字列は、クラスの読み込みの引数として使用されます。可変の場合、間違ったクラスがロードされる可能性があります(可変オブジェクトは状態を変更するため)。
例:
public class StringImmutableDemo { public static void main(String[] args) { String st1 = "Tutorials"; String st2 = "Point"; System.out.println("The hascode of st1 = " + st1.hashCode()); System.out.println("The hascode of st2 = " + st2.hashCode()); st1 = st1 + st2; System.out.println("The Hashcode after st1 is changed : "+ st1.hashCode()); } }
出力:
The hascode of st1 = -594386763 The hascode of st2 = 77292912 The Hashcode after st1 is changed : 962735579
-
Javaの最後のキーワード
finalは、Java要素の非アクセス修飾子です。 final修飾子は、クラス、メソッド、および変数の実装を確定するために使用されます。 最終変数 最終変数は明示的に一度だけ初期化できます。 finalとして宣言された参照変数を、別のオブジェクトを参照するように再割り当てすることはできません。 ただし、オブジェクト内のデータは変更できます。したがって、オブジェクトの状態は変更できますが、参照は変更できません。 変数の場合、定数をクラス変数にするために、最後の修飾子がstaticとともに使用されることがよくあります。 例 public class Test { fina
-
Javaで多重継承がサポートされていない理由
Javaでは、クラスは複数のクラスを拡張できません。したがって、以下は違法です- 例 public class extends Animal, Mammal{} ただし、クラスは1つ以上のインターフェースを実装できるため、Javaは多重継承の不可能性を取り除くことができます。 この背後にある理由は、あいまいさを防ぐためです。 クラスBがクラスAとクラスCを拡張し、クラスAとCの両方が同じメソッドdisplay()を持っている場合を考えてみます。 現在、Javaコンパイラは、どの表示メソッドを継承するかを決定できません。このような状況を防ぐために、Javaでは多重継承は許可されていません