ホームページ  >  記事  >  Java  >  Java 修飾子のabstract、static、finalの違いの詳細な説明

Java 修飾子のabstract、static、finalの違いの詳細な説明

高洛峰
高洛峰オリジナル
2017-01-24 15:42:101537ブラウズ

static は、プロパティ、メソッド、コード ブロックを変更できる静的なことを意味します。

1.static が属性 (クラス変数) を変更すると、この属性はクラス名.属性名を使用してアクセスできます。これは、この属性がこのクラスのクラス変数になり、このクラスのオブジェクトによって共有されることを意味します。この属性はすべてのクラスにパブリックです。 (共有クラス変数はオブジェクトとは関係がなく、クラスのみに関係します)。

クラスロードのプロセスでは、クラス自体もファイルに保存されます(バイトコードファイルはクラス情報を保存します)。JavaはI/Oを通じてクラスファイル(バイトコードファイル)をJVM(Java仮想マシン)に読み込みます。ストリーム.マシン)、このプロセスはクラスのロードになります。 JVM (Java 仮想マシン) は、クラスパス (CLASSPATH) を通じてバイトコード ファイルを検索します。

クラス変数はロード時に自動的に初期化されます。初期化ルールはインスタンス変数と同じです。

注: クラス内のインスタンス変数は、オブジェクトの作成時に初期化されます。静的に変更されたプロパティ、つまりクラス変数は、クラスのロード処理が 1 回実行されるときに作成および初期化されます。つまり、クラス変数は 1 回だけ作成されます。

2.static修正メソッド(staticメソッド)は、このメソッドをクラス全体に公開し、クラス名.メソッド名でアクセスできるようにします。

注: 静的に変更されたメソッドは、このクラスの非静的メンバー (メソッドとプロパティを含む) に直接アクセスできません。このクラスの非静的 (静的) メソッドは、このクラスの静的メンバー (メソッドとプロパティを含む) にアクセスできます。 、静的メソッドを呼び出すことができます。静的メソッドは注意して使用する必要があります。このキーワードは静的メソッドでは使用できません。

注: 親クラスは静的メソッドであり、カバレッジ ルールに準拠することを前提として、親クラス内の静的メソッドをサブクラスでオーバーライドすることはできません。サブクラス内の静的メソッドによるものですが、ポリモーフィズムはありません。 (オブジェクトを使用して静的メソッドを呼び出すことは、実際にはコンパイル時型の静的メソッドを呼び出すことになります)

注: 親クラスと子クラスでは、静的メソッドは静的メソッドによってのみオーバーライドできます。非静的メソッドによってオーバーライドされます。

Java の main メソッドは、クラスのロード時にオブジェクトを作成できないため、static として記述する必要があります。静的メソッドはオブジェクトなしで呼び出すことができるため、クラスの main メソッドに含まれます。クラスがロードされると、メイン メソッド エントリを通じてプログラムを実行できます。

3.static は初期コードブロックを変更します。このとき、この初期コードブロックは、クラスがロードされるときに 1 回だけ実行されます。静的初期化ブロックを使用してクラスを初期化できます。

動的初期化コード ブロック。クラス本体の「{}」に記述されます。このコード ブロックは、生成されたオブジェクトの初期化プロパティが生成されるときに実行されます。このタイプのコード ブロックは、動的初期化コード ブロックと呼ばれます。

クラスはいつロードされますか? オブジェクトを作成するとき、クラス内の静的メソッドを呼び出すとき、または静的プロパティにアクセスするときに、クラスもロードされます。サブクラスをロードするときは、親クラスを最初にロードする必要があります。クラスのロードには遅延ロードの原則があり、ロードする必要がある場合にのみロードされます。

final 修飾子は変数、メソッド、クラスを変更できます

1.final 変更された変数
fianl によって変更された変数は定数になり (定数は大文字にする必要があります)、一度割り当てられると変更できません (初期化中に直接割り当てることができます)。コンストラクターで値を代入することもできます。これら 2 つの方法のうち 1 つしか選択できず、定数に値を代入することはできません。)、fianl 定数にはデフォルトの初期値がありません。代入する際には、final 修飾子がよく使用されます。初期化中に値を直接静的修飾子とともに使用します。

2. Final で変更されたメソッド。final によって変更されたメソッドはそのサブクラスによってオーバーライドされず、メソッドの安定性をオーバーライドすることはできません。
3.finalで変更されたクラス、finalで変更されたクラスは継承されません。最終クラスのメソッドも最終です。

注: Final を使用してコンストラクターを変更することはできません。親クラスに定数属性がある場合、サブクラスで定数属性を使用すると、親クラスのクラスロードは実行されません。

不変モードでは、オブジェクトのプロパティは作成後に変更されません。 Final を使用してプロパティを変更し、final を使用してクラスを変更し (強力な不変性モード)、final を使用してプロパティを変更します (弱い不変性モード)。

不変モードの典型的な実施形態: java.lang.String クラス、不変モードはオブジェクト共有を実現できます (1 つのオブジェクト インスタンスを複数のオブジェクト変数に割り当てることができます)

プーリングのアイデアは、共有する必要があるデータをプール内(スペースの節約、データの共有)
「」にリテラル値を持つオブジェクトを作成できるのは String クラスのみです。 Stringクラスの場合、リテラル値で作成した場合、Javaメソッド空間の文字列プール空間を検索し、存在する場合は文字列プール内の文字列のアドレスを返します。オブジェクト変数に支払われます。そうでない場合は、文字列オブジェクトが文字列プールに作成され、そのアドレスが購入オブジェクト変数に返され、別のオブジェクトがリテラル値で作成されると、上記のプロセスが繰り返されます。
newがヒープ領域にStringクラスのオブジェクトを作成した場合、上記の処理は発生しません。

String クラスの intern() メソッドは、ヒープ領域に作成された String クラス オブジェクト内の文字列と文字列プールを比較し、同じ文字列が存在する場合は、文字列プールのアドレスを返します。

不変モードはオブジェクトの変更や操作の追加が非常に面倒で、大量の中間ガベージオブジェクトが生成されます。リソースの作成と破棄のオーバーヘッドはかなり大きくなります。

String クラスは、文字列を接続するときに生成されるオブジェクトのプロパティを変更できないため、文字列を接続するときに非常に非効率的です。

多くの文字列接続では、このクラスのオブジェクトを使用して文字列接続を実行する場合、冗長な中間オブジェクトが生成されないため、効率が最適化されます。

Abstract (抽象) 修飾子は、クラスとメソッドを変更できます。
1.Abstract 修飾子は、このクラスを抽象クラスにします。このクラスはオブジェクト インスタンスを生成できませんが、オブジェクト変数宣言のタイプとして使用できます。はコンパイル時型であり、抽象クラスはクラスの半完成品のようなもので、サブクラスはその中の抽象メソッドを継承してオーバーライドする必要があります。

2.抽象メソッドは、このメソッドを抽象メソッドにします。つまり、実装部分は「;」に置き換えられ、宣言 (定義) だけがあります。サブクラスが実装を継承 (オーバーライド) する必要があります。

注: 抽象メソッドを持つクラスは抽象クラスである必要があります。ただし、抽象メソッドは必ずしもすべてが抽象メソッドである必要はなく、具体的なメソッドである場合もあります。
クラスを変更するときは、抽象修飾子をクラス名の前に配置する必要があります。

抽象変更メソッドでは、そのサブクラスがこのメソッドをオーバーライド (実装) する必要があります。呼び出すときは、サブクラスによってカバーされる (実装される) メソッドをポリモーフィックな方法で呼び出すことができます。つまり、サブクラス自体が抽象クラスでない限り、抽象メソッドはそのサブクラスに実装する必要があります。

注: 親クラスは抽象メソッドを持つ抽象クラスであり、サブクラスは親クラスを継承し、親クラス内のすべての抽象メソッドを実装 (オーバーライド) して初めて、オブジェクトのインスタンスを作成できます。それ以外の場合は、サブクラスも抽象クラスでなければなりません。抽象クラスはコンストラクター メソッドを持つことができます。コンストラクター メソッドは、サブクラス オブジェクトを構築するときにサブクラスが呼び出す必要がある親クラス (抽象クラス) のコンストラクター メソッドです。

final と abstract、private と abstract、static と abstract、これらは組み合わせることができない修飾子です。abstract によって変更されたメソッドは、ポリモーフィックに呼び出す前にそのサブクラスで実装 (カバー) する必要があるためです。このメソッドは、サブクラスでオーバーライドできません。Private はサブクラスに継承できないため、Static はオーバーライドできません。ただし、メソッドを呼び出すと、コンパイル時の型が呼び出されます。親クラスが呼び出されますが、親クラスのメソッドは抽象メソッドで呼び出すことができないため、メソッドの修飾子をまとめることができません。

抽象メソッドは、特定の標準を表し、標準を定義し、関数を定義し、サブクラスで関数を実装します (サブクラスは親クラスを継承し、親クラスから継承した抽象メソッドの実装を提供する必要があります)。
このメソッドはしばらくの間実現できないか、サブクラスによって実装されることが意図されており、特定の標準を定義しています。このメソッドは抽象として定義できます。 (abstract)

テンプレートメソッドパターン
標準の策定と標準の実装を分離するために抽象を使用します。策定された標準はテンプレートであり、実装はテンプレートの標準に従って実装されます。つまり、テンプレートを継承して、対応する機能を実装します。テンプレート内にあります。テンプレート内で変更が許可されていないメソッドは、 fianl を使用して変更できます。このメソッドでは、安全性とカプセル化を確保するために、テンプレートの非公開部分を protected で変更する必要があります。

Java 修飾子の abstract、static、final の違いの詳細については、PHP 中国語 Web サイトの関連記事に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。