final修飾符:
final修飾成員變數必須有程式設計師顯示指定初始值。
類別的Field:必須在靜態初始化區塊中或宣告該Field時指定初始值。
實例Field:必須在非靜態初始區塊中,聲明Field或建構器中指定初始值。
final局部變數:必須由程式設計師顯示初始化。
final修飾的基本變數和引用型別變數的差別?
final修飾的基本變數:不能重新賦值基本變數。
final修飾的參考變數:只保證這個引用型別所引用的位址不會改變,也就是一直引用同一個對象,但這個物件完全可以改變。
複製代碼代碼如下:
/**
*/
import java.util.*;
public class Demo5
{
public static void main(String[] args)
{
final B b = new B(22);
b.test();
//合法改變值,但仍是指向同一個引用
b.setAge(20);
System.out.println(b.getAge());
// 非法
// b = null;
b.test2();
}
}
/**
fianl修飾成員變量
*/
class A
{
//合法
final int a = 10;
//在建構器或初始化化區塊中指定初始值
final String str;
final int c;
final static double d;
{
str = "hello";
//非法
// a = 100;
}
static
{
d = 100;
}
// 建構器可對沒在初始化區塊中指定的Field指定初始值
public A()
{
// 非法
// str = "ddd";
c = 1000;
}
public double changFinal()
{
// 不能再在普通方法中為final指定初始值
// return d = 1000.90;
return 0;
}
}
/**
fianl修飾數組對象
*/
class B
{
private int age;
public B()
{
}
public B(int age)
{
this.age = age;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
public void test()
{
final int[] arr={23,434,56,898};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
arr[2] = 200;
System.out.println(Arrays.toString(arr));
//下面對Arr重新賦值非法
// arr = null;
}
/**
加深對final的理解
*/
public void test2()
{
String str1 = "美好未來";
//直接引用常數池中的"美好未來"
String str2 = "美好"+"未來";
//true
System.out.println(str1 == str2);
String s1 = "美好";
String s2 = "未來";
String s3 = s1+s2;
//false s1 s2只是變數在編譯時期無法確定
//若想在編譯時期確定則用final修飾s1 s2
System.out.println(str1 == s3);
}
}
小夥伴們是否對java中final修飾符有所了解了呢,相信註釋中已經給大家解釋的很清楚了,我這裡就不再嗦