日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

一、概述

final是JAVA關(guān)鍵字中最常見(jiàn)之一,表示“最終的,不可更改”之意,在Java中也正是這個(gè)意思。

有final修飾的內(nèi)容,就會(huì)變得與眾不同,它們會(huì)變成終極存在,其內(nèi)容成為固定的存在。

finally關(guān)鍵字不同于final關(guān)鍵字,這是一個(gè)需要與異常體系結(jié)構(gòu)配合使用的關(guān)鍵字,旨在定義必須要進(jìn)行操作,一般用于在發(fā)生異常的時(shí)候進(jìn)行一些收尾操作,比如釋放資源等。

另外還有個(gè)finalized,它是一個(gè)方法,它需要與垃圾收集體系配合使用。主要在對(duì)象被垃圾收集之前進(jìn)行一些操作,這些操作只會(huì)被執(zhí)行一次,即使一個(gè)對(duì)象多次被標(biāo)記為下次進(jìn)行垃圾收集,也只有第一次會(huì)執(zhí)行。

二、final作用

2.1 final修飾變量

變量被final修飾就會(huì)變成為常量,常量被保存在方法區(qū)中。

變量一旦被final修飾,必須手動(dòng)進(jìn)行初始化,未進(jìn)行初始化的final常量是無(wú)法通過(guò)編譯的。

如果只有final修飾的變量的初始化可以采用:

  • 定義時(shí)賦值
  • 代碼塊賦值
  • 構(gòu)造器賦值

如果被static和final同時(shí)修飾的變量的初始化可以采用:

  • 定義時(shí)賦值
  • 靜態(tài)代碼塊賦值

一旦final變量被static修飾,那么它就脫離了對(duì)象的組織(代碼塊、構(gòu)造器都是對(duì)象的組織),升級(jí)為類的組織,所以需要在類級(jí)別的靜態(tài)代碼塊中進(jìn)行初始化。

public class FinalTest {
    final int i = 1;
    int j = 2;
    static int m = 3;
    static final int n = 4;
}

public class FinalTest {
    final int i;
    int j;
    static int m;
    static final int n;
    {
        i = 1;
    }
    static {
        n = 3;
    }
}

如果將上面的代碼改成:

public class FinalTest {
    final int i;//2-
    int j;
    static int m;
    static final int n;//5-
}

上面代碼第2行和第5行會(huì)報(bào)錯(cuò),原因就是未進(jìn)行初始化。

那么我們總結(jié)下final和static的現(xiàn)象,用于區(qū)分二者:

  • static修飾將內(nèi)容脫離對(duì)象成為類成員。
  • final修飾將內(nèi)容改造成必須被手動(dòng)初始化的成員,一旦賦值,不再改變。

注意:同時(shí)被final和static修飾的變量成為靜態(tài)常量,類常量,這種類常量在編譯階段會(huì)進(jìn)行常量傳播優(yōu)化,將該類常量的值直接保存到調(diào)用類的常量池中,那么在程序執(zhí)行到調(diào)用位置時(shí),實(shí)際上與定義該類常量的類已經(jīng)毫無(wú)關(guān)系,我(調(diào)用方)可以直接在我的常量池中獲取到編譯階段優(yōu)化過(guò)來(lái)的值,不再需要通過(guò)常量定義類的類型去調(diào)用其中定義的那個(gè)類常量了。

二者可以同時(shí)存在,各起各的作用。

2.2 final修飾方法

被final修飾的方法,可以被子類繼承,但是不能被子類重寫,也就是說(shuō)這個(gè)方法在此以后其內(nèi)部的實(shí)現(xiàn)就是固定不變的了,不能被改變。

2.3 final修飾類

被final修飾的類,被稱之為最終類,其不再擁有子類,不可再進(jìn)行擴(kuò)展,最常見(jiàn)的final類就是String類。

String類被final修飾之后,其每個(gè)對(duì)象都是不變的,一旦定義就不再發(fā)生改變。

2.4 final修飾局部變量

final修飾的局部變量,該變量就不再是保存在棧空間中,而是保存在方法區(qū)中,不會(huì)隨方法結(jié)束而失效,放大了局部變量的生命周期。

最常使用的地方就是局部?jī)?nèi)部類在訪問(wèn)方法的局部變量的情況下,這些局部變量就需要使用final修飾,因?yàn)楫?dāng)局部?jī)?nèi)部類訪問(wèn)局部變量時(shí),會(huì)放大局部變量的作用域,局部變量一般在方法結(jié)束時(shí)就失效了,但是卻有可能任然被內(nèi)部類的對(duì)象持有使用。將該局部變量定義為final之后,它不再保存于棧空間,而是保存在方法區(qū)中,自然不會(huì)因?yàn)榉椒ǖ慕Y(jié)束而丟失。

public class FinalTest{
    public void outMethod(){
       final int s = 1;// 3-
        class innerClass{
            public void innerMethod(){
                System.out.println(s);
            }
        }
    }
}

如果去掉第3行的final,第5行就會(huì)報(bào)錯(cuò)。

2.5 final修飾方法參數(shù)

如果方法的參數(shù)被final修飾,那么這個(gè)參數(shù)的值在從方法調(diào)用時(shí)賦值開(kāi)始就不能再改變,不能被重新賦值(不能改成他值)。

public class FinalTest{
    public void outMethod(final int s){
       s = 1;
    }
}

如上代碼,方法參數(shù)s為final的,那么若去掉第2行的代碼,為s重新賦值,則會(huì)報(bào)錯(cuò)。

三、finally作用

finally只有一種用法,那就是在try...catch..語(yǔ)句末尾使用。語(yǔ)法如下:

public class FinallyTest{
    public void test(){
        try{
          //someExecute
        }catch(Exception e){
          //someExecute
        }finally{
          //someExecute
        }
    }
}

finally塊中的語(yǔ)句是一定會(huì)被執(zhí)行的,無(wú)論是否會(huì)發(fā)生異常,重點(diǎn):這里的異常指的是在try塊中的部分,如果實(shí)在try塊之前發(fā)生了異常,還沒(méi)來(lái)得及執(zhí)行try塊語(yǔ)句,那么finally塊中的內(nèi)容也不會(huì)被執(zhí)行,所以finally針對(duì)的是try塊中的內(nèi)容而設(shè)的。

如果在try塊或catch塊中存在return語(yǔ)句,那么,finally塊中的內(nèi)容必然會(huì)在return之前執(zhí)行。

finally經(jīng)常用于發(fā)生異常的情況下關(guān)閉打開(kāi)的資源,比如io流,網(wǎng)絡(luò)資源等。

四、finalized作用

finalized是Object類的protected方法。

當(dāng)垃圾回收器發(fā)現(xiàn)一個(gè)對(duì)象不存在任何引用的時(shí)候,就會(huì)觸發(fā)該方法的調(diào)用,調(diào)用由垃圾回收器發(fā)起。

子類重寫該方法一般用于處理系統(tǒng)資源或者一些清理工作。

該方法并不被確保一定會(huì)調(diào)用,但是可以保證的是,一旦被調(diào)用,調(diào)用的線程并不會(huì)持有任何的同步鎖,而且如果執(zhí)行發(fā)生了異常,則忽略異常,同時(shí)停止執(zhí)行。也就是說(shuō),finalized方法并不會(huì)對(duì)程序的正常流程、代碼的正常運(yùn)行造成意外的影響。

class FinalizedTest{
    @Override
    public void finalize(){
        // do something
    }
}

簡(jiǎn)述finalized執(zhí)行流程:

當(dāng)對(duì)象變成(GC Roots)不可達(dá)時(shí),GC會(huì)判斷該對(duì)象是否覆蓋了finalize方法,若未覆蓋,則直接將其回收。否則,若對(duì)象未執(zhí)行過(guò)finalize方法,將其放入F-Queue隊(duì)列,由一低優(yōu)先級(jí)線程執(zhí)行該隊(duì)列中對(duì)象的finalize方法。執(zhí)行finalize方法完畢后,GC會(huì)再次判斷該對(duì)象是否可達(dá),若不可達(dá),則進(jìn)行回收,否則,對(duì)象“復(fù)活”。(摘自參考文章)

參考:

  • java finalize方法總結(jié)、GC執(zhí)行finalize的過(guò)程 - ScaleZ - 博客園

分享到:
標(biāo)簽:基礎(chǔ) Java
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定