ホームページ > Java > &#&はじめる > Javaオブジェクト指向の最終修飾子

Javaオブジェクト指向の最終修飾子

王林
リリース: 2019-11-26 14:43:17
転載
2760 人が閲覧しました

Javaオブジェクト指向の最終修飾子

1. 最終修飾子の定義:

final キーワードは、クラス、変数、メソッドを変更するために使用できます

final変数を使用する場合、変数は初期値を取得すると変更できないことを意味します(厳密には、final で変更された変数は変更できません。初期値を取得すると、final 変数の値を再代入することはできません) )

final はメンバー変数 (クラス変数とインスタンス変数) だけでなく、ローカル変数や仮パラメータも変更できます

関連ビデオ学習チュートリアル:Java オンライン学習

2. 最終メンバー変数の構文では次のように規定されています:

最終変更メンバー変数にはプログラマによって明示的に指定された初期値が必要であり、システムは最終メンバーを暗黙的に初期化しません。

1. 最終的に変更されたクラス変数およびインスタンス変数が初期値を設定できる場所は次のとおりです:

クラス変数: 初期値は静的初期化ブロックまたはクラス変数を宣言するとき、 value と

インスタンス変数は 2 つの場所のいずれかでのみ指定する必要があります: 初期値はインスタンス変数の宣言内の非静的初期化ブロックで指定する必要があります。またはコンストラクター内で、3 か所のみそのうちの 1 つが指定されます

注: 通常の初期化ブロックでインスタンス変数の初期値が指定されている場合、インスタンス変数の初期値を指定することはできなくなります。コンストラクター内のインスタンス変数

次のプログラムは、最終的に変更されたメンバー変数の効果を示しています:

package lextends;
public class FinalVariableTest {
    //定义成员变量时指定默认值,合法
    final int a = 6;
    //下面变量将在构造器或初始化块中分配初始值
    final String str;
    final int c;
    final static double d;

    //既没有指定默认值,又没有在初始化块、构造器中指定初始值
    //下面定义的ch实例是不合法的
    //final char ch;
    //初始化块,可对没有指定默认值的实例变量指定初始值
    {
        //在初始化块中为实例变量指定初始值,合法
        str = "Hello";
        //定义a实例变量时已经指定了默认值
        //不能为a重新赋值,因此下面赋值语句非法
        //a=9;
    }

    //静态初始化块,可对没有指定默认值的类变量指定初始值
    static {
        //在静态初始化块中为类变量指定初始值,合法
        d = 5.6;
    }

    //构造器,可以对既没有指定默认值,又没有在初始化块中,指定初始值的实例变量指定初始值
    public FinalVariableTest() {
        //如果在初始化块中已经对str指定了初始值
        //那么在构造器中不能对final变量重新赋值,下面赋值语句非法
        //str="java"
        c = 5;
    }

    public void changeFinal() {
        //普通方法不能为final修饰的成员变量赋值
        //d=1.2
        //不能在普通方法中为final成员变量指定初始值
        //ch = 'a';
    }
public static void mian(String[] args){
    FinalVariableTest ft= new FinalVariableTest();
    System.out.println(ft.a);
    System.out.println(ft.c);
    System.out.println(ft.d);}
}
ログイン後にコピー

2. コンストラクターまたは初期化ブロックで最終メンバー変数を初期化する予定の場合、初期化前にメンバー変数の値にアクセスしないでください。

package lextends;
public class FinalErrorTest {
    //定义一个final修饰的实例变量
    //系统不会对final成员变量进行默认初始化
    final int age;
    {
        //age没有初始化,所以此处代码将引起错误,因为它试图访问一个未初始化的变量
        //只要把定义age时的final修饰符去掉,程序就正确了
        System.out.println(age);
        
        age=6;
        System.out.println(age);
    }
    public static void main(String[] args){
        new FinalErrorTest();
    }
}
ログイン後にコピー

3. 最終的なローカル変数

1. 定義: システムはローカル変数を初期化しません。ローカル変数はプログラマによって明示的に初期化される必要があります。したがって、final を使用してローカル変数を変更する場合、定義時にデフォルト値を指定することも、デフォルト値を指定することもできません。

次のプログラムは、ローカル変数と仮パラメータの最終的な変更を示しています。

(最終的に変更された仮パラメータのケース。このメソッドが呼び出されると、システムは、

package lextends;
public class FinalLocalVariable {
    public void test(final int a){
        //不能对final修饰的形参赋值,下面语句非法
        //a=5;
    }
    public static void mian(String[] args){
        //定义final局部变量时指定默认值,则str变量无法重新赋值
        final String str="hello";
        //下面赋值语句非法
        //str="Java";
        
        //定义final局部变量时没有指定默认值,则d变量可被赋值一次
        final double d;
        d=5.6;
        //对final变量重新赋值,下面语句非法
        //d=6.4;
    }
}
ログイン後にコピー

4. 最終的に変更された基本型変数と参照型変数の違い

# #最終変更を使用する参照型変数は再割り当てできませんが、参照型変数によって参照されるオブジェクトの内容は変更できます

たとえば、以下の iArr 変数によって参照される配列オブジェクト、その後の iArr 変数最終的な変更は再代入できませんが、iArr 要素が参照する配列の配列は変更できます

eg.
//final修饰数组元素,iArr是一个引用变量
final int[] iArr={5,6,12,9};
System.out.println(Arrays.toString(iArr));
//对数组元素进行排序,合法
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//对数组进行元素赋值,合法
iArr[2]=-8;
System.out.println(Arrays.toString(iArr));
//下面语句对iArr重新赋值,非法
//iArr=null;
ログイン後にコピー

5.「マクロ置換」を実行できる最終変数

1 . 最終変数の場合、それがクラス変数であっても、インスタンス変数であっても、ローカル変数であっても、その変数が 3 つの条件を満たす限り、この最終変数は変数ではなくなり、直接量と等価になります。

(1) Final 修飾子を使用して変更する

(2) Final 変数定義時に初期値を指定する

(3) 初期値はコンパイル時に設定可能time Determined

2.final 修飾子の重要な用途は、「マクロ変数」を定義することです。最終的な変数が定義されると、その変数に初期値が代入され、変数であるかどうかを決定できます。この場合、この最終的な変数は本質的に「マクロ変数」となり、コンパイラはこれを使用するすべての変数を削除します。プログラム内の変数を変数の値に直接置き換えます。

3,

eg.
String s1="疯狂Java";
//s2变量引用的字符串可以在编译时就确定下来
//因此s2直接引用变量池中已有的"疯狂Java"字符串
String s2="疯狂"+"Java";
System.out.println(s1==s2);//true

//定义两个字符串直接量
String str1="疯狂";
String str2="Java";
String s3=str1+str2;
System.out.println(s1==s3);//false
ログイン後にコピー
s3 の場合、その値は str1 と str2 を連結することによって取得されます。str1 と str2 は単なる 2 つの通常の変数であるため、コンパイラーは「マクロ」「Replace」を実行しません。そのため、コンパイラは s3 の値を決定できず、s3 が文字列プールにキャッシュされた「Crazy Java」を指すようにすることもできません。

その他の Java 関連の記事やチュートリアルについては、次のリンクを参照してください:

Java 入門チュートリアル

以上がJavaオブジェクト指向の最終修飾子の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート