[解決済み] なぜJavaでprotected staticを使用してはいけないのか?
疑問点
私はこのような質問をしました。 Javaでクラス変数をオーバーライドする方法はありますか? というコメントがあり、36のアップヴォートを獲得しました。
もし、あなたが
protected static
を見たら、走ってください。
誰か説明してください。
protected static
が嫌われる理由を説明できる人はいますか?
どのように解決するのですか?
直接的な問題というより、文体的なものです。クラスで何が起こっているのかをきちんと考えていないことを示唆しています。
を考えてみてください。
static
の意味を考えてみてください。
この変数はクラスレベルで存在し、各インスタンスに個別に存在するわけではありませんし を拡張するクラスでは独立した存在にはなりません。 .
何を考えるか
protected
の意味を考えてみてください。
この変数は、このクラス、同じパッケージのクラスから見ることができます および私を拡張したクラス .
この2つの意味は正確には相反するものではありませんが、かなり近いものがあります。
この 2 つを一緒に使うことができる唯一のケースは、拡張されるように設計された抽象クラスがあり、拡張クラスが元のクラスで定義された定数を使用して動作を変更できる場合です。このような配置は、ほとんどの場合、非常に面倒なことになり、クラスの設計の弱点を示すことになります。
ほとんどの場合、定数をパブリックにしたほうがよいでしょう。抽象クラスが継承を強制する一方で、多くの場合、合成は継承よりも望ましいのです。
これがどのように物事を壊しうるかの一例と、変数が独立した存在でないことが何を意味するかを説明するために、次のサンプルコードを試してみてください。
public class Program {
public static void main (String[] args) throws java.lang.Exception {
System.out.println(new Test2().getTest());
Test.test = "changed";
System.out.println(new Test2().getTest());
}
}
abstract class Test {
protected static String test = "test";
}
class Test2 extends Test {
public String getTest() {
return test;
}
}
結果が表示されます。
test
changed
で自分で試してみてください。 https://ideone.com/KM8u8O
クラス
Test2
は、静的メンバ
test
から
Test
から、名前を修飾することなく、
関連
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
Spring Boot による HTTPS アクセスの設定
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み] Javaでクラス変数をオーバーライドする方法はありますか?