最終クラス
最終クラスを継承することはできません。同時に、クラスが最終的に変更されると、最終クラスのすべての方法が最終的な方法として暗黙的に指定されていることを意味します。
最終的な方法
クラスの継承の過程で、親クラスの最終的な方法でサブクラスを変更または上書きすることはできません。
プライベート方法はすべて、最終的な方法として暗黙的に指定されています。
最終的な方法を使用する理由は2つあります。
最終変数
最終的なキーワードは、変数を変更するために最も一般的に使用される方法です。メンバー変数が変更されている場合、定義時またはコンストラクターで初期化する必要があり、初期化後に割り当てを行うことはできません。
基本的なタイプとクラスオブジェクトにはさまざまな意味があります。
静的な最終フィールドは、コンパイル周期定数と呼ばれ、一般に大文字です。
例
class glyph {void draw(){system.out.println( "glyph.draw()"); } glyph(){system.out.println( "glyph()befored()");描く(); system.out.println( "glyph()after draw()"); }} class roundglyphはglyphを拡張します{private int redius = 1; roundglyph(int r){radius = r; system.out.println( "roundglyph.roundglyph()、radius =" + radius); } void draw(){system.out.println( "roundglyph.draw()、radius =" + radius); }} public class rolyconstructors {public static void main(string [] args){new RoundGlyph(5); }}出力結果:
glyph()draw()roundglyph.draw()、radius = 0glyph()aby draw()roundglyph.roundglyph()、radius = 5
上記のコードは、クラスの初期化プロセスと隠された壊滅的な問題を示しています。
メイン関数は、パラメーター5を備えたRoundGlyphコンストラクターを呼び出してRoundGlyphオブジェクトを作成し、RoundGlyphコンストラクターが実行される前に、親クラスのGlyphのRoundGlyphコンストラクターが呼び出されます。
ただし、描画方法は、親クラスのグリフのコンストラクターで呼び出されます。多型により、サブクラスの抽選方法は実際に呼び出されます。ただし、サブクラスのレディウスは現時点ではコンストラクターを介して初期化されていないため、出力は次のとおりです。
roundglyph.draw()、radius = 0
これは明らかに私たちが望む結果ではないので、次のことに注意することが重要です。
2番目の理由は、最終が多型を適用しないため、初期化作業で実行されていないサブクラスのオーバーライド方法ではなく、現在のオブジェクトの対応する方法が呼び出されることを保証できることです。
ファイナルのメモリ割り当て方法を要約します:
1.変数の変更:
一般的に、最終変数を割り当てることができる3つの場所があります:直接割り当て、コンストラクター、または初期化ブロック。
(1)初期化:
宣言と初期化はJava構文に関連しているため、
つまり、初期化変数を表示しない場合、システムはデフォルト値で自動的に初期化します。 (intが0の場合)
最終変数の場合、宣言されたときに値を割り当てない場合、システムはこれをデフォルトで、コンストラクターで初期化されます。
静的な場合は、ブロックを初期化できます。
(2)メモリ:
定数の処理方法(最終変数)と非ファイナル変数は異なります。
各タイプが定数を使用すると、コピーを独自の定数プールにコピーします。
定数は、クラス変数(静的)などのメソッド領域にも保存されますが、定数プールに保存されます。
(おそらく、クラス変数はすべてのインスタンスで共有されますが、一定のプールは各インスタンスに固有です。)
2。変更方法:
メソッド領域に保存され、実行が特定の機能を決定するまで待機することなく、関数コードに直接置き換えることができます。
3。変更カテゴリ:
メソッド領域を保存します。