java - static 和final

static

在《Java編程思想》P86頁(yè)有這樣一段話:
“static方法就是沒(méi)有this的方法。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類本身來(lái)調(diào)用static方法。這實(shí)際上正是static方法的主要用途?!?/p>

這段話雖然只是說(shuō)明了static方法的特殊之處,但是可以看出static關(guān)鍵字的基本作用,簡(jiǎn)而言之,一句話來(lái)描述就是:

方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用(方法/變量)。

很顯然,被static關(guān)鍵字修飾的方法或者變量不需要依賴于對(duì)象來(lái)進(jìn)行訪問(wèn),只要類被加載了,就可以通過(guò)類名去進(jìn)行訪問(wèn)。

static可以用來(lái)修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來(lái)優(yōu)化程序性能。

static class

一般情況下是不可以用static修飾類的。如果一定要用static修飾類的話,通常static修飾的是匿名內(nèi)部類。
在一個(gè)類中創(chuàng)建另外一個(gè)類,叫做成員內(nèi)部類。這個(gè)成員內(nèi)部類可以靜態(tài)的(利用static關(guān)鍵字修飾),也可以是非靜態(tài)的

public class MainInStaticClass {
 
    static class Main{
    static void main() {
    //將主方法寫到靜態(tài)內(nèi)部類中,從而不必為每個(gè)源文件都這種一個(gè)類似的主方法
    new MainInStaticClass().print();
    }
}

static方法

  • static方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問(wèn),因此對(duì)于靜態(tài)方法來(lái)說(shuō),是沒(méi)有this的,因?yàn)樗灰栏接谌魏螌?duì)象,既然都沒(méi)有對(duì)象,就談不上this了。并且由于這個(gè)特性,在靜態(tài)方法中不能訪問(wèn)類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴具體的對(duì)象才能夠被調(diào)用。
  • 但是要注意的是,雖然在靜態(tài)方法中不能訪問(wèn)非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問(wèn)靜態(tài)成員方法/變量的
  • 調(diào)用時(shí)直接類名.方法 不用在實(shí)例化  MyObject.print2();
package testP.test;

class Person {
    private static boolean name;
    protected String age;
    protected String sex;
    String how;
    public Person() {
        name = false;
    }
    static String getName() {  //靜態(tài)方法
        String age1 = age; // 報(bào)錯(cuò)了,不是static變量
        boolean name1 = name;
    }
}

static變量

  • static變量也稱作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本,它當(dāng)且僅當(dāng)在類初次加載時(shí)會(huì)被初始化。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化,存在多個(gè)副本,各個(gè)對(duì)象擁有的副本互不影響。
  • static成員變量的初始化順序按照定義的順序進(jìn)行初始化。

static代碼塊

  • static關(guān)鍵字還有一個(gè)比較關(guān)鍵的作用就是 用來(lái)形成靜態(tài)代碼塊以優(yōu)化程序性能。static塊可以置于類中的任何地方,類中可以有多個(gè)static塊。在類初次被加載的時(shí)候,會(huì)按照static塊的順序來(lái)執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次。
  • 注意如果有構(gòu)造函數(shù)和static同時(shí)使用時(shí),先調(diào)用static,然后調(diào)用構(gòu)造函數(shù)

實(shí)例

package testP.test;

class Person {
    private static boolean name;
    protected String age;
    protected String sex;
    String how;
    Person() {
        System.out.println("Person默認(rèn)構(gòu)造函數(shù)");
    }
    static {
        System.out.println("Person靜態(tài)代碼顯示框");
    }
    
    static String getName() {
        return  name?"真數(shù)據(jù)":"假數(shù)據(jù)";
    }
}


package testP.test;

public class son2 {
    public son2() {
        System.out.println("son2默認(rèn)構(gòu)造函數(shù)");
    }
    static {
        System.out.println("son2的靜態(tài)代碼");
    }
    
     public static void main(String[] args) {
         son2 s = new son2();    
        System.out.println(Person.getName());
         }  
}

結(jié)果為:
son2的靜態(tài)代碼
son2默認(rèn)構(gòu)造函數(shù)
Person靜態(tài)代碼顯示框
假數(shù)據(jù)

  • 結(jié)果沒(méi)有調(diào)用Person類里面的構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)是要在類被實(shí)例化后才會(huì)被執(zhí)行

final

如果一個(gè)類不允許其子類覆蓋某個(gè)方法,則可以把這個(gè)方法聲明為final方法。

final方法

使用final方法的原因有二:

  • 第一、把方法鎖定,防止任何繼承類修改它的意義和實(shí)現(xiàn)。
  • 第二、高效。編譯器在遇到調(diào)用final方法時(shí)候會(huì)轉(zhuǎn)入內(nèi)嵌機(jī)制,大大提高執(zhí)行效率。

final 類

  • final類不能被繼承,因此final類的成員方法沒(méi)有機(jī)會(huì)被覆蓋,默認(rèn)都是final的。在設(shè)計(jì)類時(shí)候,如果這個(gè)類不需要有子類,類的實(shí)現(xiàn)細(xì)節(jié)不允許改變,并且確信這個(gè)類不會(huì)載被擴(kuò)展,那么就設(shè)計(jì)為final類。

static和final一起

static final用來(lái)修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”! 對(duì)于變量,表示一旦給值就不可修改,并且通過(guò)類名可以訪問(wèn)。 對(duì)于方法,表示不可覆蓋,并且可以通過(guò)類名直接訪問(wèn)。

http://www.cnblogs.com/dolphin0520/p/3799052.html
http://blog.163.com/fanning_7213/blog/static/24965052010731270601/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,652評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,810評(píng)論 0 11
  • 1、.java源文件: 一個(gè)以”.java“為后綴的源文件:只能有一個(gè)與文件名相同的類,可以包含其他類。 2、類方...
    Hughman閱讀 1,741評(píng)論 1 9
  • Win7下如何打開DOS控制臺(tái)? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,702評(píng)論 4 12
  • 母親離開一周年了,眼淚化了墳前絮絮地細(xì)語(yǔ)——離開了的母親必是不愿意看到眼淚的——我們眼里的淚何嘗不是母親心底的痛!...
    菜根宴閱讀 493評(píng)論 0 0

友情鏈接更多精彩內(nèi)容