エントリJ2SE(v)の最終キーワードに
フロントでは文字列を説明し、最終的なキーワードに言及、キーワードの最終紙が解決されます。
静的および最終的には、我々は、キーワードを習得しなければならない2つです。他のキーワードとは異なり、彼らは様々な用途を持っているだけでなく、特定の状況下で使用され、プログラムの構造を最適化するためのプログラムの動作性能を向上させることができます。のは、見てみましょう、最終的なキーワードとその使用方法。
最終的には、クラス、メソッド、変数を変更するために使用することができ、全体的に「不変」です。
A.最終的なクラス
継承することができない、最終的な修飾クラス。あなたはクラスが継承されることはありませんか継承させたくないことを確認すると、それは最終的に変更することができます。
同様に、設計されたこの「多状態」にあるインターフェイス(インターフェイス)と抽象クラス(抽象クラス)、のために、あなたは、キーワード、最終的な変更を使用することはできません
また、暗黙的に指定され、最終的なデフォルトのメソッドですfinalクラスのメンバー。
二つ。最終的な方法
最終修正方法をオーバーライドすることはできません。
例:
/**
* 父类
* @author LH
*/
public class FinalDemo1 {
public final void test() {
}
}
三。最後の変数
最後の変数は、メンバ変数とローカル変数が含まれます。変数の型は、基本データ型、オブジェクトが含まれます。
ローカル変数(およびそのパッケージング)の最終的な基本的なタイプを変更することによって、初期化された値は、(初期化を定義することができ、使用前に初期化することができる)を変更することはできません。以下のような:
final int a = 0;
a = 1;//报错
final int b;
b = 1;//编译通过
オブジェクト(メモリアドレス)を参照の局所によって参照型変数最終的修飾は、(初期化を定義することができ、使用前に初期化することができる)を変更することができない、しかし、オブジェクトに格納されたデータが変化してもよいです
public static void main(String[] args) {
final String str1 = "helloWorld";
str1 = "helloChina";//编译出错,String的不可变性,此处返回的是新的对象引用。
final StringBuilder sb = new StringBuilder("hello");
sb.append("world");//编译通过
sb = new StringBuilder("China");//编译出错
}
最後のメンバ変数は、それ以外の場合はエラーをコンパイルします、直接定義時に初期化修正されなければなりません
public class FinalDemo1 {
public final int age;//final修饰的基本类型,编译出错
public final int age1 = 20;//final修饰的基本类型,编译通过
public final StringBuilder address;// final修饰的引用类型,编译出错
public final StringBuilder address1 = new StringBuilder("中国");//final修饰的引用类型,编译通过
}
例最後に、最終的な、通常の変数との違いは何か、下記を参照してくださいので
public static void main(String[] args) {
String str0 = "helloWorldChina";
String str1 = "helloWorld";
String str3 = str1 + "China";
System.out.println(str0 == str3);//false
final String str2 = "helloWorld";
String str4 = str2 + "China";
System.out.println(str0 == str4);//true
final String str5;
str5 = "helloWorld";
String str6 = str5 + "China";
System.out.println(str0 == str6);//false
}
STR0に「これは、リターンアドレスとSTR0が同じになることはありません参照する新しい文字列オブジェクトを生成するために、「+」によるので== STR3の演算結果が、偽であるJ2SEエントリ(c)の文字列の深さの分析はで説明しています」 。
なぜ結果STR0 == STR4は本当ですか?
(彼は変数の初期化を定義したとき)には、コンパイル時に正確な値を知ることができれば、最終的な変数によって変更、その後、コンパイラは定数としてそれを使用しますが、一定の使用の直接同等に使用されるすべてのローカル変数、文字列STR4 = STR2 +「中国は」文字列STR4 =「helloWorldChina」にコンパイル処理中にマージされ、その同じ参照STR4 STR0のアドレスの文字列リテラル定数プールで、したがって、結果はtrueですされています。
STR6がfalse ==実施STR0の結果も十分に理解されています
コンパイル時STR5は、正確な値を知りませんでしたが、唯一、使用する前に初期化するので、コンパイラは、合併のプロセスを進めることができない、新しい文字列オブジェクトを生成するために、「+」によってSTR6とアドレスではなくSTR0への参照を返します。再び同じ。
そして、基本データ型のため、最終的に通常の変数として定義され、比較結果には違いはありません
public static void testint(){
int int0 = 8;
final int int1;
int1 = 4;
int int2 = int1 + 4;
System.out.println(int2 == int0);//true
}
参照によって渡された基本データ型だけではなくがあるため、変数の基本的なタイプは、リテラルであるため、操作の基本的なタイプは、値に直接操作され、基準が同じではなく、アドレス比較はありません。
IV。まとめ
本論文では、単により明確にする==テキスト文字列変数に加えて、比較を説明した最終的なキーワードの原則に焦点を当てて、最終的な変更クラス、最終的修飾法と変数の最終修正を含め、基本的な使用方法について説明し説明最後の原則、最終的かつ静的な時間やイコール()メソッドを持つ実用的なアプリケーションシナリオの比較は、多くの場合、不完全な場合は、「グローバル定数」と組み合わせて使用してください、批判と一緒に進歩を遂げることを期待、あなたに感謝しています!