java基礎文法之final關鍵字
1、final關鍵字的含義。
Java關鍵字final有“無法改變的”、“最終的”等含義。可以修飾類,方法和成員變量。
final修飾的類不能被繼承。(網上部分文章有結論:final類中的方法預設是final的。我不知道是怎麼得出來的,但是感覺不對,寫了個方法測試了下,證明結論是錯誤的。)
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public final class FinalDemo
{
public void normalMethod(){}
public final void finalMethod(){}
public static void main(String[] args)
{
try
{
Method normalMethod = FinalDemo.class.getMethod("normalMethod", null);
Method finalMethod = FinalDemo.class.getMethod("finalMethod", null);
System.out.println(Modifier.toString(normalMethod.getModifiers()));
System.out.println(Modifier.toString(finalMethod.getModifiers()));
}
catch (NoSuchMethodException | SecurityException e)
{
e.printStackTrace();
}
}
}
輸出結果:
public
public final
final方法不能被子類的方法覆寫。(網上有結論說final方法不能被子類方法覆寫,但是可以被繼承,可以被繼承應該是和final無關的,而是和方法的通路修飾符有關,例如public、private、protected,試想private final的那是肯定無法繼承到子類的。)
final成員變量表示常量,隻能被指派一次。(網上很多說法是指派後值不再改變,其實這種說法不準确,被final修飾的值,如果是基本類型,那麼值不可變,如果是對象,則是引用不可變,對象的内容是可以改變的。)
public class TestDemo
{
public static void main(String[] args)
{
final StringBuilder sb = new StringBuilder("hello");
sb.append(" world");
System.out.println(sb.toString());
}
}
還有一種說法:父類的private成員方法是不能被子類方法覆寫的,是以private類型的方法預設是final類型的。我就搞不懂了,final确實是禁止覆寫的意思,但是不能覆寫就一定是final在起作用?,明顯是private方法不能被繼承到子類,都沒有繼承到子類也就談不上覆寫這種說法了。直接上例子:
public class FinalDemo
{
private void normalMethod(){}
private final void finalMethod(){}
public static void main(String[] args)
{
try
{
Method normalMethod = FinalDemo.class.getDeclaredMethod("normalMethod", null);
Method finalMethod = FinalDemo.class.getDeclaredMethod("finalMethod", null);
System.out.println(Modifier.toString(normalMethod.getModifiers()));
System.out.println(Modifier.toString(finalMethod.getModifiers()));
}
catch (NoSuchMethodException | SecurityException e)
{
e.printStackTrace();
}
}
}
輸出結果:
private
private final
對final關鍵字含義的總結:
final修飾的類不能被繼承。
final修飾的方法不能被覆寫。
final成員變量表示常量,隻能被指派一次。被final修飾的值,如果是基本類型,那麼值不可變,如果是對象則是引用不可變,對象的内容是可以改變的。
網上很多總結都是錯誤的,是“一家之言”,希望大家學習的時候本着技術的質疑和追根究底精神,而不是一味的盲從,把錯誤當成常識。
final的其他特性:
final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。
final本地變量必須在聲明時指派。
2、final應用場景
String以及Integer、Long等基本資料類型封裝類都是final class;
Math中PI 和 E 都是用final修飾的字段;
Math中sin cos等函數也是用final修飾的;