Javaの最後のキーワードの使用


記事の内容は、Shang Silicon Valley、jdk8、Eclipse環境から選択されています

最終キーワードの使用

最後のキーワードは、クラス、メソッド、および変数を変更できます

最終的なキーワード変更クラス

Java標準ライブラリのStringクラス、Systemクラス、StringBufferクラスなど、finalキーワードで変更されたクラスは継承できません。

package com.atguigu.java3;

public class FinalTest {
    
    

}

//class A extends String{
    
    
//	
//}

コメントされたコンパイラの一部はエラーを報告します。これは、標準ライブラリのStringクラスにキーワードfinalmodificationがあり、Stringクラスを継承できないためです。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

上記は、キーワードの最終変更を加えた、標準ライブラリでの文字列の定義です。

最終修正方法

finalキーワードで変更されたメソッドは、ObjectクラスのgetClassメソッドのように、メソッドをオーバーライドできないことを意味します。

//class AA{
    
    
//	public void getClass(){
    
    
//		
//	}
//}

getClassメソッドは現在のオブジェクトが属するクラスを返すため、コンパイラのコメント部分もエラーを報告します。Objectクラスでは、このメソッドはファイナライズされており、オーバーライドできません。
ps:crtl + shift + tを押してObjectクラスを見つけ、ctrl + oを押してこのクラスのすべてのメソッドを表示し、getClassをクリックします。

    public final native Class<?> getClass();

    /**
     * Returns a hash code value for the object. This method is
     * supported for the benefit of hash tables such as those provided by

クラスのgetClassメソッドにも最終変更
psがあることがわかります。ここのメソッドはメソッド本体を表示せず、ネイティブキーワードもあります。ネイティブキーワードは、メソッドのメソッド本体を意味します。はcまたはc ++で記述されており、Javaコードでは記述されていません。基になるコードに属しているため、表示されません。

最終的に変更された変数

  • 最終的に変更された変数、この時点での変数は定数になります。定数は、変更が許可されていないことを意味します。
  • finalで変更された変数は、通常大文字で記述されます。

Finalは変数を変更しますが、属性も変数に属しているため、finalは属性も変更できます。属性を最終的に変更するときに、値を明示的に割り当てるか、コードブロックで値を初期化してコンストラクターを初期化できます。

属性の最終変更時の明示的な初期化

属性を最終的に変更するときに、デフォルトで初期化できません

package com.atguigu.java3;

public class FinalTest {
    
    
	final int WIDTH = 0;
}

最終キーワードがない場合、属性WIDTHに初期値が割り当てられていなくても、デフォルトの初期化も0ですが、最終キーワードの変更があるため、明示的な初期化を使用する必要があります。
ps:ctrl + shift + xは、小文字を大文字に変更できます。

最終的に属性を変更するときにコードブロックで初期化します

package com.atguigu.java3;

public class FinalTest {
    
    
	final int WIDTH = 0;
	final int LEFT;
	
	{
    
    
		LEFT = 1;
	}
}

属性の最終変更時のコンストラクターでの初期化

コンストラクターの初期化を使用すると、必要な値をオブジェクトの最終属性に割り当てることができます。これは、明示的な割り当てよりも柔軟性があります。

package com.atguigu.java3;

public class FinalTest {
    
    
	final int WIDTH = 0;
	final int LEFT;
	final int RIGHT;
	
	{
    
    
		LEFT = 1;
	}
	
	public FinalTest(){
    
    
		RIGHT =2;
	}
	
//	public FinalTest(){
    
    
//		
//	}
}

コメントアウトされた部分はエラーとして報告されます。コンストラクターを介して初期化する場合、コンストラクターを呼び出すときに呼び出すことができるのは1つだけであるため、各コンストラクター内でfinal属性を割り当てる必要があることに注意してください。属性の割り当て。

コメントアウトされたコンストラクター内にRIGHT代入ステートメントを追加すると、コンパイルは成功します。

public class FinalTest {
    
    
	final int WIDTH = 0;
	final int LEFT;
	final int RIGHT;
	
	{
    
    
		LEFT = 1;
	}
	
	public FinalTest(){
    
    
		RIGHT =2;
	}
	
	public FinalTest(int n){
    
    
		RIGHT = n;
	}
}

この時点で、コンストラクターを介して任意のint値を属性RIGHTに割り当てることができます。

ps:既存のオブジェクトが存在する場合、オブジェクトと属性を介して値を割り当てるため、最終的に変更された属性をオブジェクトと属性を介して割り当てることはできません。オブジェクトを作成するとき、定義された属性には初期値が必要です。初期値は、デフォルトの初期値またはコンストラクターによって初期化された値にすることができます。とにかく、値が必要です。しかし、クラスを定義したときに、finalで属性を変更すると、属性は定数になりました。これは、最終的に変更された属性をデフォルトで初期化できないためです。したがって、オブジェクトを作成する前に、他の方法で初期化する必要があります。したがって、最終属性は定数であり、変更できないため、object。属性は値を変更できません。

最終的にローカル変数を変更します

public class FinalTest {
    
    
	final int WIDTH = 0;
	final int LEFT;
	final int RIGHT;
	
	{
    
    
		LEFT = 1;
	}
	
	public FinalTest(){
    
    
		RIGHT =2;
	}
	
	public FinalTest(int n){
    
    
		RIGHT = n;
	}
	
	public void show(final int num){
    
    
//		num = 20;//常量不允许被修改,只能被调用
		System.out.println(num);
	}
	
	public static void main(String[] args) {
    
    
		FinalTest test = new FinalTest();
		test.show(10);
	}
	
}

出力結果は10です
。showメソッドがここでコンパイルされる理由は、仮パラメーターが呼び出されたときにのみスタックスペースで変数を宣言し、属性の明示的な初期化と同様に実際のパラメーター値を渡すためです。したがって、コンパイルは成功しました。仮パラメータはfinalで変更されているため、showメソッドのnumは呼び出すことしかできず、変更することはできません。num = 20;コンパイラはエラーを報告します。

補足:静的な最終変更属性、つまりグローバル定数、静的キーワード変更属性は、クラスのロードを通じてロードすることを意味します。これは、グローバルを反映するようにクラスを直接調整することにより、最終的に定数を反映します。

おすすめ

転載: blog.csdn.net/Meloneating/article/details/114164412