基本的な理解:
1. 変更されたクラス
ときにクラスへの最終的な変更は、クラスが継承することはできませんことを示しています。セキュリティでは、JDKに、これらのクラスを継承することができないなど、文字列の最後のクラス、システムを持つように設計されています。注:このクラスの修飾された最後のメンバーが変更されてもよい、それがなくてもよいです。
2.修正方法:
この方法は、サブクラスでオーバーライドすることはできません。一般的にクラスで使用されるサブクラスと設計変更によって上書きされたくありません。
3.パラメータを変更する方法:
修正パラメータ変数は、生体内で再割り当てすることはできません。これは、考慮ハの呼び出し側の視点に立っているように見える、それは兄が私にナイフを取り、人々を見て私に言っているようだ、兄は、変更しないで、それをチョップするためにナイフを使用しなければならない、と述べましたTulongは、機関銃を変更したくない、またはあなたが死にました。合計が場所を知らない、パラメータ値のこの最後の変更が理解していなかったことを感じませんでした。
4.修飾メンバ変数。
変更されたメンバ変数は一度だけ割り当てることができます。これは、クラスの初期化の前に割り当てられます。
深い理解、および使用
メンバ変数を変更し、いくつかの機能の主な用途は、(個人的にこれは、より使用されていると思います)は、Javaでの使用します。
1.改変最後のメンバ変数の使用は、設計上のクラスを使用してクラスの割り当て、継承で初期化されなければなりません。
シナリオ:フィールドのフィールドがありますが、時間のクラスAの設計に必要とされます。しかし、このクラスは、多くのサブクラスを持つことができ、各サブクラスの値は同じではありません。そして、あなたは最終的により変更fileldを設計することができます。サブクラスの初期化時間の割り当て。コードとして、私は人の名前は、名前がPersonクラスを設計する必要がありますが、最終的に修正フィールド名と、コンストラクタに割り当てられた名前を聞かせて一人一人の名前が、異なっていることを前提としています。だから、サブクラスは人が名前の割り当てに人のコンストラクタを呼び出す必要があります継承します。私たちは、引数なしのコンストラクタの使用を失うことになるバグを持っています。
パブリック クラス人{ 最終的な文字列名; // 割り当てなし、それはコンストラクタで割り当てる必要があります。 公共人(文字列名){ この .nameの= 名; } 公共 ボイドworlk(){ } }
パブリック クラスの学生は、拡張人{ 公共の学生(文字列名){ スーパー(名前を)。// 必须调用父类的构造器 } @Override パブリック文字列のtoString(){ リターン "生徒[NAME =" +名+ "]" 。 } パブリック 静的 ボイドメイン(文字列[]引数){ 生徒S = 新しい生徒( "A" )。 学生S1 = 新しい学生( "B" ); System.err.println(S); // 输出:学生[名= A] System.err.println(S1); // 出力:学生[NAME = B] } }
「Javaのマルチスレッドのプログラミングガイド」から2.finalキーワード特別な意味並行プログラミングコード
パブリック クラスFinalFieldExample { 最終 int型のX; int型のyを。 静的FinalFieldExampleインスタンス。 パブリックFinalFieldExample(){ X = 1 。 Y = 2 。 } パブリック 静的 ボイドライター(){ インスタンス = 新しいFinalFieldExample()。 } パブリック 静的 ボイドリーダー(){ 最終 FinalFieldExample theInstance = インスタンス。 もし(theInstance!= nullの){ int型theInstance.y =差分- theInstance.x; // diffが1(= 2-1)であってもよく、それはまた、-1(= 0-1)であってもよいです。 印刷(差分); } } プライベート 静的 ボイド印刷(int型X){ // ... } }
より多くの並行プログラミングは、セキュリティ上のリスクが存在します、もちろん、イベントでこのようなコード設計がされません。この本は、列子の参照のためにのみ使用されます。オブジェクト(オブジェクトのメンバーのために)、実際には、しないアトミック操作を初期化するコンパイラです。上記のコードでは、約擬似コードの等価物をFinalFieldExample時間を初期化します。
= OBJREF(FinalFieldExample割り当てクラス); // サブ操作1:割り当てのために必要なオブジェクトストレージ空間 objRef.x = 1; // サブ操作2:オブジェクトの初期化 objRef.y = 2:// サブ操作3:オブジェクトの初期化 = OBJREFインスタンス; // サブ操作4:参照変数にオブジェクトを割り当てます
しかし、時には、コンパイラは、再コンパイルし、コードを最適化します。オブジェクトの初期化の後に割り当てられている変数yがステップは、第四の後であろう前に、第三のステップがあってもよい、即ち、完了しました。これは、この瞬間の第4工程を完了するために実行されてもよい、別のスレッドがこのオブジェクトを呼び出し、次にYのデフォルト初期値の値は、0の代わりに2の期待値です。最終的な改変は、FinalFieldExample初期化の前に割り当てられなければならないので、変数Xの値は、保証することができ、ソート後4工程と、他のスレッドに可視確実にするために、そのステップ2を確実にするために最適化することができません。
X = 1;上記のすべてのコードは、Yは、最終変更後、呼び出し元のスレッドは、所望の値y = 2を得るために保証することができます。
3.デザイン・セキュリティオブジェクト:不変オブジェクト。
更新します...