何1.finalです
最終的にJavaは修飾子は、変数、メソッド、変更されたクラスを変更するために使用することができ、キーワードです。
用途は何ですか2.final
- 最後の変数を変更することができる場合は、その値を変更することはできません
- これは、書き換えができないとき、最終的な修正方法
- 最終的には、クラスを変更すると、それを継承することはできません。
3.final修飾メンバ変数
fianl修飾メンバ変数の最も一般的な用途は、メンバー変数は、静的および正規変数に分割するときに使用される。
変数の最終的な変更のためではなく、可能な値を割り当て、その値は変更することができない、それは唯一理解できる割り当てることができません割り当てを定義するとき、それはまた別の定義の後に割り当てることができますが、いずれかの方法は、一度だけ割り当てることができます。
静的変数の(1)変形例
静的変数を変更すると、次の2つの方法の割り当てを選択することができます。
- 割り当てを定義する場合
- 静的初期化ブロックの割り当て
final static int a = 6;
final static int b;
static
{
b = 6;
}
(2)通常のメンバ変数を変更します
通常のメンバ変数を変更する場合、次の3つの方法の割り当てのいずれかを選択できます。
- あなたは割り当てを定義するとき
- 初期化ブロックの割り当て
- コンストラクタの割り当て
public class test
{
int c = 1;
int d;
int e;
{
d = 2;
}
public test()
{
e = 3;
}
}
「静的」によると、静的な初期化ブロックは非静的メンバを初期化することができない、通常の初期化ブロックは、静的変数を初期化することができない、静的メソッドは非静的メンバにアクセスすることができないことを、「非静的」ルールにアクセスすることはできません。
しかし、「バグ」があるjavaのですこの方法は、最終的なメンバーにアクセスすることができますので、...面白いことが起こりました。
public class test
{
final int a;
{
System.out.println(a);//这里会报错
printA();
a = 3;
printA();
}
void printA()
{
System.out.println(a);
}
public static void main(String[] args) {
new test();
}
}
Javaは、最終的なメンバーが訪問する前に初期化されていないことはできませんので、上記のコードは、エラーになります。
エラーコードは、実際にコンパイラによって...上記のコメント行の後に!
public class test
{
final int a;
{
//System.out.println(a);//这里会报错
printA();
a = 3;
printA();
}
void printA()
{
System.out.println(a);
}
public static void main(String[] args) {
new test();
}
}
出力機能のための単なるラッパーでprintA()メソッドは、実際には、コンパイラによって...結果を見て全く関心がありませんか?
emmmmmm ....最後の「デフォルトは」0 .....短いですれていない変数の最終初期化の前に、これらの不正最終的にアクセスするために final変数の初期化初期化初期化を使用する前に、3回を言うべき重要なこと。
4.final変更ローカル変数
ローカル変数の最終的な変形は、実際には2つあり、一方は変性パラメータAで内部変数の一部を変更する方法であります
(1)パラメータを変更し
...何も言うことは、パラメータ値を変更することができないということではありません。
public void f(final int a)
{
a = 3;//报错.
}
(2)ローカル変数を変更します
ローカル変数は、(一度だけ)割り当ての後にも定義することができる場合には、割り当てを定義し、修正することができます。
public void f()
{
final int a = 3;
final int b;
b = 2;
}
(3)最終的な修正された参照変数
ああ.....これは話して安いです。コードの特別な小さな例です。
import java.util.Arrays;
public class test
{
public static void main(String[] args) {
final int[] arr = {1,2,3};
arr[1] = 5;
Arrays.stream(arr).forEach(System.out::print);
System.out.println();
final A a = new A();
a.setA(9);
System.out.println(a.getA());
}
}
class A
{
private int a = 3;
public void setA(int a)
{
this.a = a;
}
public int getA()
{
return a;
}
}
なぜ???最終配列値fianlオブジェクトが結果を見て???変更される割り当てることができます
最終的な配列は、実際に値を変更して??の最終目的は、??変更
アレイが最終、参照型であるため、実際ときに修正された参照型のみこの変数は常に保存されたいくつかのメモリ空間がちょうど参照され、それは同じ理由であるオブジェクトを変更するときに、メモリ空間の一部の値を変更することができることを「点」であることを確認することができます。
5.final修飾法
最終的修飾法をオーバーライドすることはできません、もちろん、プライベート、同等のサブクラスへのプライベートメソッドからプライベート「の使用」「と」親クラスのサブクラスを知らない、表示されていないことはできない「とこの事を。」 、いわゆる「リライト」を行うことができます。
class A
{
private final void f(){}
}
class B extends A
{
public final void f(){}//没毛病
}
クラスB fが()、カテゴリBに属しているので、上のクラスAから継承されません。
6.final修正クラス
最終的修飾クラスが表す場合クラスが継承することができません。
final class A{}
class B extends A{}//出错
これは、著者の公開数、歓迎の注意です。