Javaでは、最終的なキーワードを使用して、オブジェクトが不変であることを宣言します。ここのオブジェクトには、C ++のconstキーワードに似た変数、メソッド、クラスが含まれます。
不変とは、オブジェクトが作成された後、状態を変更できないことを意味します。 3つの観点から最終キーワードを使用することを検討できます。
最終変数
最終オブジェクトAを定義すると、Aは1回しか初期化できません。初期化されると、Aのデータを変更できません。 aが参照タイプの場合、他のオブジェクトを反対させることはできません。
初期化されていない最終変数は、Blank Finalと呼ばれます。メンバー変数の場合、コンストラクターに初期化または割り当てられる必要があります。
例:
Class Circle {static final double pi = 3.1415926;最終int radius = 5;最終int xpos;最終的なint ypos;パブリックサークル(int x、int y){xpos = x; ypos = y; }}最終的な方法
最終的な方法を定義する場合、メソッドを過負荷にすることはできません。メソッドデザイナーは、メソッドの過負荷のために他の関連関数を発生させたくありません。
例:
class Baseclass {public final void method(){}} class derivedclassはbaseclass {public final void method(){} //コンピレーションエラー}最終的なメソッドの定義は、インラインであるかどうかは、最終キーワードではなくJVMの戦略に依存するかどうかは、最終設計を通じてメソッドの効率を改善することは不正確であるため、必ずしもインラインの効果を生み出すとは限らないことに注意する必要があります。
最終クラス
最終クラスXで定義された最終クラスXを継承することはできません。
Javaでは、文字列クラスは最終的に設計されており、その定義は次のとおりです。
コードコピーは次のとおりです。
パブリッククラスの最終文字列拡張オブジェクトは、シリアル化可能、比較可能な<文字列>、チャーセッケンスを拡張します
内部クラスと最終
メソッドで匿名の内部クラスを定義する場合、内部クラスはメソッド内の最終型変数のみにアクセスできるため、Javaコンパイラは変数の値を事前にキャプチャし、内部クラスにコピーを保存できます。メソッドが破壊されると、内部クラスのメモリスペースがまだ完了します。
例:
パブリッククラスラッパー{public static void main(string [] args){// object obj = null; //エラー最終オブジェクトobj = nullをコンパイルします。新しいスレッド(new runnable(){public void run(){obj = "hello";}})。start(); }} PS:内部匿名クラスが外部の非ファイナル変数にアクセスできないことを発行する
これは少し話すのが難しいように聞こえますが、実際、Java内部クラスのいくつかの機能についてもっと話したいと思います。
この質問を考える理由は、最近JDKソースコードでHTTP Keepaliveに関するコードを読んでいたとき、ソースファイルの1つであるsun.net.www.protocol.http.httpurlconnection.javaが偶然に次のコードを見たからです。
final boolean result [] = {false}; java.security.accesscontroller.dopriviledeged(new java.security.priviledecortion(){try {inetAddress a1 = inetaddress.getbyname(h1); inetadress a2 = inetaddress a2 = inetaddress a2 = inetadress a2 = inetadress a2 = inetadress a2 = inetadress a2 = inetadress a2 = inetaddress a1.equals(a2); catch(unknownhostexception {} catch(securityexception {} return null);Javaの匿名の内部クラスは、対応する関数の非ファイナル変数にアクセスできません。外部ローカル変数にアクセスするには、この変数を最初にFIANLとして定義する必要があります。ただし、最終的に定義されると、この変数の値を匿名の内部クラスで変更することはできないため、匿名の内部クラスでいくつかの有用な値を返すことはそれほど簡単ではありません。このコードは非常に巧妙な方法を使用して、ここで配列を使用してこの制限をバイパスします。変数の結果への参照を変更することはできませんが、結果ごとに指摘された配列のコンテンツを変更できます。
内部の匿名クラスによって外部変数を変更するための少しのトリックを記録したいだけです。しかし、ここに到着したので、内部クラスにどのような機能や制限があるかを確認し続けることもできます。
この記事を継続する前に、この記事に関係するJava用語のいくつかを明確にすることが非常に必要だと感じています。これらの用語は中国語に翻訳するのは容易ではないため、英語で説明します。
//これはクラスパブリッククラスのJavaterm {//フィールドまたはメンバー変数プライベートINTフィールドです。 // constructor public javaterm(){} // method public void method(){// local variable int localvariable = 0; // local class localclass {public localclass(){}} //匿名クラスnew runnable(){public void run(){}}; }}今日は、地元のクラスと匿名のクラスにもっと焦点を当てます。どちらもインナークラスに属します。
Javaを使用すると、ネストされたクラスと呼ばれるクラス内の別のクラスを定義することができ、ネストされたクラスは2つのカテゴリに分割できます。1つは静的ネストクラス、もう1つは内側クラスとしても知られる非静的ネストクラスです。内部クラスは、ローカルクラスと匿名クラスに分けることもできます。
匿名クラスのいくつかの制限