1、final用在類上表示該類不能被繼承
2、final用在方法上表示該方法不能被重寫(override)
3、final用在變量上表示該變量一旦被賦值後它的值將不能被改變
對於final類型的成員變量的初始化方式
1、聲明變量時直接賦值
2、在構造方法中完成賦值
3、對於static的final類型的成員變量,只能通過在變量聲明時直接賦值,不能通過在構造方法中完成賦值,因爲static的變量是優先於構造方法執行的,而static的final類型的成員變量在聲明時有點特殊:不會被設置成默認的值(如int a;本應該在聲明時會自動設置成默認的值"0")
4、對於final類型的引用變量來說,所謂的不能改變指的是該引用不能被改變,而不是該引用的內容不能被改變
在構造方法中完成賦值的注意點:
如果一個類有多個構造方法,那麼必須在每個構造方法中對final類型的成員變量賦值,否則將通不過編譯
java 代碼
package com.test;
public class FinalTest {
private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
a = 5;
this.name = name;
}
public static void main(String[] args){
FinalTest ft = new FinalTest();
FinalTest ft2 = new FinalTest("hello");
}
}
java 代碼
package com.test;
public class FinalTest {
private static final int a = 3;
//private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 5;
this.name = name;
}
public static void main(String[] args){
FinalTest ft = new FinalTest();
FinalTest ft2 = new FinalTest("hello");
}
}
java 代碼
package com.test;
public class FinalTest {
private static final StringBuffer s = new StringBuffer();
//private static final int a = 3;
//private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 5;
this.name = name;
}
public static void main(String[] args){
//此時可以通過編譯,因爲改變的只是引用內容,而不是引用的內存地址,但是如果這裏的代碼是 s = new StringBuffer();就通不過編譯了,因爲如果這樣的話,s指向了新的引用地址,這是final所不允許的
s.append("hello");
// FinalTest ft = new FinalTest();
// FinalTest ft2 = new FinalTest("hello");
}
}
2、final用在方法上表示該方法不能被重寫(override)
3、final用在變量上表示該變量一旦被賦值後它的值將不能被改變
對於final類型的成員變量的初始化方式
1、聲明變量時直接賦值
2、在構造方法中完成賦值
3、對於static的final類型的成員變量,只能通過在變量聲明時直接賦值,不能通過在構造方法中完成賦值,因爲static的變量是優先於構造方法執行的,而static的final類型的成員變量在聲明時有點特殊:不會被設置成默認的值(如int a;本應該在聲明時會自動設置成默認的值"0")
4、對於final類型的引用變量來說,所謂的不能改變指的是該引用不能被改變,而不是該引用的內容不能被改變
在構造方法中完成賦值的注意點:
如果一個類有多個構造方法,那麼必須在每個構造方法中對final類型的成員變量賦值,否則將通不過編譯
java 代碼
package com.test;
public class FinalTest {
private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
a = 5;
this.name = name;
}
public static void main(String[] args){
FinalTest ft = new FinalTest();
FinalTest ft2 = new FinalTest("hello");
}
}
java 代碼
package com.test;
public class FinalTest {
private static final int a = 3;
//private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 5;
this.name = name;
}
public static void main(String[] args){
FinalTest ft = new FinalTest();
FinalTest ft2 = new FinalTest("hello");
}
}
java 代碼
package com.test;
public class FinalTest {
private static final StringBuffer s = new StringBuffer();
//private static final int a = 3;
//private final int a;
private String name;
public FinalTest()
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 3;
}
public FinalTest(String name)
{
//如果final成員變量未在聲明時直接賦值,那麼每個構造方法裏必須要對它進行賦值,否則將通不過編譯
//a = 5;
this.name = name;
}
public static void main(String[] args){
//此時可以通過編譯,因爲改變的只是引用內容,而不是引用的內存地址,但是如果這裏的代碼是 s = new StringBuffer();就通不過編譯了,因爲如果這樣的話,s指向了新的引用地址,這是final所不允許的
s.append("hello");
// FinalTest ft = new FinalTest();
// FinalTest ft2 = new FinalTest("hello");
}
}