final是一個java關鍵字,一個修飾符,可用于修飾變量,方法,修飾類.
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,臨武企業(yè)網(wǎng)站建設,臨武品牌網(wǎng)站建設,網(wǎng)站定制,臨武網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,臨武網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
fianl最常見的用法時用來修飾成員變量,成員變量分為靜態(tài)變量與普通變量.
對于final修飾的變量,不是不能被賦值,是其值不能被改變,可以理解成只能賦一次值.可以在定義時賦值,也可以在定義后在另外賦值,但無論何種方式只能被賦值一次.
修飾靜態(tài)變量時,可以選擇以下兩種方式賦值:
final static int a = 6;
final static int b;
static
{
b = 6;
}
修飾普通成員變量時,可以選擇以下三種方式賦值:
public class test
{
int c = 1;
int d;
int e;
{
d = 2;
}
public test()
{
e = 3;
}
}
根據(jù)"靜態(tài)"不能訪問"非靜態(tài)"規(guī)則,就是說靜態(tài)的方法不能訪問非靜態(tài)成員,static初始化塊不能初始化非靜態(tài)成員,普通初始化塊也不能初始化靜態(tài)變量.
但是,有一個"bug"就是java允許通過方法訪問final成員,因此...有趣的事情發(fā)生了.
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不允許final成員未初始化前訪問.
把上面那一行出錯的代碼注釋后...居然通過了編譯?!
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()中只是用方法包裝了一下輸出函數(shù),居然就通過了編譯...有沒有興趣看一下結(jié)果?
emmmmmm....final"默認值"為0.....總之就不要想這些歪門邪道去在final初始化之前訪問final變量了 ,在使用final變量前初始化,初始化,初始化,重要的事情說三遍.
final修飾局部變量其實也分兩種,一種是修飾形參,一種是修飾方法內(nèi)部的局部變量
沒什么好說的...就是形參的值不能改變.
public void f(final int a)
{
a = 3;//報錯.
}
修飾局部變量時可以定義時賦值,也可以在定義后在賦值(僅一次).
public void f()
{
final int a = 3;
final int b;
b = 2;
}
嗯.....這個是一個特別一點的例子,Talk is cheap.上代碼.
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;
}
}
為什么final數(shù)組可以賦值???fianl對象的值被改變了???看看結(jié)果:
final數(shù)組居然被改變了??final對象的值也被改變了??
其實呢,因為數(shù)組是引用類型,final修飾引用類型時,只能保證這個變量永遠"指向"那一段內(nèi)存空間,保存的僅僅是一個引用,但是那段內(nèi)存空間的值是可以改變的.修飾對象時也是一樣的道理.
final修飾的方法不能被重寫,當然,不能"配合"private"使用",因為private把方法變成了私有,相當于對子類不可見,子類都不知道父類"還有這玩意",就可以進行所謂的"重寫"了.
class A
{
private final void f(){}
}
class B extends A
{
public final void f(){}//沒毛病
}
因為B類的f()是屬于B類的,不是從A類繼承過來的.
final修飾類時表示該類不能被繼承.
final class A{}
class B extends A{}//出錯
文章題目:聊聊java中final那點事
文章源于:http://chinadenli.net/article14/giejge.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、小程序開發(fā)、云服務器、動態(tài)網(wǎng)站、網(wǎng)站策劃、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)