日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解JAVA中static的作用

瀏覽:10日期:2022-08-31 14:23:23

1、深度總結(jié)

引用一位網(wǎng)友的話,說(shuō)的非常好,如果別人問(wèn)你static的作用;如果你說(shuō)靜態(tài)修飾 類(lèi)的屬性 和 類(lèi)的方法 別人認(rèn)為你是合格的;如果是說(shuō) 可以構(gòu)成 靜態(tài)代碼塊,那別人認(rèn)為你還可以; 如果你說(shuō)可以構(gòu)成 靜態(tài)內(nèi)部類(lèi), 那別人認(rèn)為你不錯(cuò);如果你說(shuō)了靜態(tài)導(dǎo)包,那別人認(rèn)為你很OK;

那我們就先在這幾方面一一對(duì)static進(jìn)行總結(jié);然后說(shuō)一些模糊的地方,以及一些面試中容易問(wèn)道的地方;

1)static方法

static方法一般稱(chēng)作靜態(tài)方法,由于靜態(tài)方法不依賴(là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)類(lèi)的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都是必須依賴(lài)具體的對(duì)象才能夠被調(diào)用。

但是要注意的是,雖然在靜態(tài)方法中不能訪問(wèn)非靜態(tài)成員方法和非靜態(tài)成員變量,但是在非靜態(tài)成員方法中是可以訪問(wèn)靜態(tài)成員方法/變量的。舉個(gè)簡(jiǎn)單的例子:

詳解JAVA中static的作用

在上面的代碼中,由于print2方法是獨(dú)立于對(duì)象存在的,可以直接用過(guò)類(lèi)名調(diào)用。假如說(shuō)可以在靜態(tài)方法中訪問(wèn)非靜態(tài)方法/變量的話,那么如果在main方法中有下面一條語(yǔ)句:

MyObject.print2();

此時(shí)對(duì)象都沒(méi)有,str2根本就不存在,所以就會(huì)產(chǎn)生矛盾了。同樣對(duì)于方法也是一樣,由于你無(wú)法預(yù)知在print1方法中是否訪問(wèn)了非靜態(tài)成員變量,所以也禁止在靜態(tài)成員方法中訪問(wèn)非靜態(tài)成員方法。

而對(duì)于非靜態(tài)成員方法,它訪問(wèn)靜態(tài)成員方法/變量顯然是毫無(wú)限制的。

因此,如果說(shuō)想在不創(chuàng)建對(duì)象的情況下調(diào)用某個(gè)方法,就可以將這個(gè)方法設(shè)置為static。我們最常見(jiàn)的static方法就是main方法,至于為什么main方法必須是static的,現(xiàn)在就很清楚了。因?yàn)槌绦蛟趫?zhí)行main方法的時(shí)候沒(méi)有創(chuàng)建任何對(duì)象,因此只有通過(guò)類(lèi)名來(lái)訪問(wèn)。

2)static變量

static變量也稱(chēng)作靜態(tài)變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別是:靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本【存放在方法區(qū)】,它當(dāng)且僅當(dāng)在類(lèi)初次加載時(shí)會(huì)被初始化【加final和不加final的static變量初始化的位置不一樣】。而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化,存在多個(gè)副本,各個(gè)對(duì)象擁有的副本互不影響。

static成員變量的初始化順序按照定義的順序進(jìn)行初始化。

3)static代碼塊

static關(guān)鍵字還有一個(gè)比較關(guān)鍵的作用就是 用來(lái)形成靜態(tài)代碼塊以?xún)?yōu)化程序性能。static塊可以置于類(lèi)中的任何地方,類(lèi)中可以有多個(gè)static塊。在類(lèi)初次被加載的時(shí)候,會(huì)按照static塊的順序來(lái)執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次【根據(jù)class加載原理 每個(gè)類(lèi)加載一次 使用雙親委托加載】。

初始化的順序 靜態(tài)代碼塊 > 構(gòu)造代碼塊 > 構(gòu)造函數(shù)

public class Client { {//構(gòu)造代碼塊 System.out.println('執(zhí)行構(gòu)造代碼塊'); }}

為什么說(shuō)static塊可以用來(lái)優(yōu)化程序性能,是因?yàn)樗奶匦?只會(huì)在類(lèi)加載的時(shí)候執(zhí)行一次。下面看個(gè)例子:

class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf('1946'); Date endDate = Date.valueOf('1964'); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; }}

isBornBoomer是用來(lái)這個(gè)人是否是1946-1964年出生的,而每次isBornBoomer被調(diào)用的時(shí)候,都會(huì)生成startDate和birthDate兩個(gè)對(duì)象,造成了空間浪費(fèi),如果改成這樣效率會(huì)更好,其實(shí)就是利用了靜態(tài)代碼塊在內(nèi)存中值加載一次的機(jī)制:

class Person{ private Date birthDate; private static Date startDate,endDate; static{ startDate = Date.valueOf('1946'); endDate = Date.valueOf('1964'); } public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; }}

因此,很多時(shí)候會(huì)將一些只需要進(jìn)行一次的初始化操作都放在static代碼塊中進(jìn)行。

4)靜態(tài)內(nèi)部類(lèi)

這個(gè)地方不單獨(dú)寫(xiě)靜態(tài)內(nèi)部類(lèi),通過(guò)和普通的內(nèi)部類(lèi)對(duì)比來(lái)加深對(duì)靜態(tài)內(nèi)部類(lèi)的理解:

為何要用內(nèi)部類(lèi)?

1. 內(nèi)部類(lèi)一般只為其外部類(lèi)使用;【供外部類(lèi)使用說(shuō)的很好 舉例 hashmap集合中 有一個(gè)內(nèi)部類(lèi) Entry 就是 轉(zhuǎn)為為 hashmap 存儲(chǔ)來(lái)使用】

2. 內(nèi)部類(lèi)提供了某種進(jìn)入外部類(lèi)的窗戶(hù),內(nèi)部類(lèi)存在外部類(lèi)的引用,所以?xún)?nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的屬性;

3. 也是最吸引人的原因,每個(gè)內(nèi)部類(lèi)都能獨(dú)立地繼承一個(gè)接口,而無(wú)論外部類(lèi)是否已經(jīng)繼承了某個(gè)接口。因此,內(nèi)部類(lèi)使多重繼承的解決方案變得更加完整。

定義在一個(gè)類(lèi)內(nèi)部的類(lèi)叫內(nèi)部類(lèi),包含內(nèi)部類(lèi)的類(lèi)稱(chēng)為外部類(lèi)。內(nèi)部類(lèi)可以聲明public、protected、private等訪問(wèn)限制,可以聲明 為abstract的供其他內(nèi)部類(lèi)或外部類(lèi)繼承與擴(kuò)展,或者聲明為static、final的,也可以實(shí)現(xiàn)特定的接口。

外部類(lèi)按常規(guī)的類(lèi)訪問(wèn)方式(以對(duì)象的方式)使用內(nèi)部 類(lèi),唯一的差別是外部類(lèi)可以訪問(wèn)內(nèi)部類(lèi)的所有方法與屬性,包括私有方法與屬性,外部類(lèi)訪問(wèn)內(nèi)部類(lèi),需要?jiǎng)?chuàng)建對(duì)象訪問(wèn);有一點(diǎn)需要注意,內(nèi)部類(lèi)不能訪問(wèn)外部類(lèi)所在的局部變量,只能訪問(wèn)final修飾的局部變量。

舉例: 在方法中 定義內(nèi)部類(lèi) 然后內(nèi)部類(lèi) 調(diào)用方法的的入?yún)?則 入?yún)⒈仨毷? final 修飾

在方法內(nèi)定義內(nèi)部類(lèi)時(shí),如果內(nèi)部類(lèi)調(diào)用了方法中的變量,那么該變量必須申明為final類(lèi)型,百思不得其解,后來(lái)想到應(yīng)該是生命周期的原因,因?yàn)榉椒▋?nèi)定義的變量是局部變量,離開(kāi)該方法,變量就失去了作用,也就會(huì)自動(dòng)被消除,而內(nèi)部類(lèi)卻不會(huì)離開(kāi)它所在方法就失去作用,它有更廣的生命周期,下面通過(guò)一個(gè)實(shí)例加以說(shuō)明:

詳解JAVA中static的作用

(1)創(chuàng)建實(shí)例

OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部類(lèi)實(shí)例.new,內(nèi)部類(lèi)AAA.StaticInner in = new AAA.StaticInner();//注意是外部類(lèi)本身,靜態(tài)內(nèi)部類(lèi)

(2)內(nèi)部類(lèi)中的this

內(nèi)部類(lèi)中的this與其他類(lèi)一樣是指的本身。創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),它會(huì)與創(chuàng)造它的外圍對(duì)象有了某種聯(lián)系,于是能訪問(wèn)外圍類(lèi)的所有成員,不需任何特殊條件,可理解為內(nèi)部類(lèi)鏈接到外部類(lèi)。 用外部類(lèi)創(chuàng)建內(nèi)部類(lèi)對(duì)象時(shí),此內(nèi)部類(lèi)對(duì)象會(huì)秘密的捕獲一個(gè)指向外部類(lèi)的引用,于是,可以通過(guò)這個(gè)引用來(lái)訪問(wèn)外圍類(lèi)的成員。

(3)外部類(lèi)訪問(wèn)內(nèi)部類(lèi)

內(nèi)部類(lèi)類(lèi)似外部類(lèi)的屬性,因此訪問(wèn)內(nèi)部類(lèi)對(duì)象時(shí)總是需要一個(gè)創(chuàng)建好的外部類(lèi)對(duì)象。外部類(lèi)對(duì)象通過(guò)‘外部類(lèi)名.this.xxx’的形式訪問(wèn)內(nèi)部類(lèi)的屬性與方法。如:

System.out.println('Print in inner Outer.index=' + pouter.this.index);System.out.println('Print in inner Inner.index=' + this.index);

(4)內(nèi)部類(lèi)向上轉(zhuǎn)型

內(nèi)部類(lèi)也可以和普通類(lèi)一樣擁有向上轉(zhuǎn)型的特性。將內(nèi)部類(lèi)向上轉(zhuǎn)型為基類(lèi)型,尤其是接口時(shí),內(nèi)部類(lèi)就有了用武之地。如果內(nèi)部類(lèi)是private的,只可以被它的外部類(lèi)問(wèn),從而完全隱藏實(shí)現(xiàn)的細(xì)節(jié)。

(5)方法內(nèi)的類(lèi)

方法內(nèi)創(chuàng)建的類(lèi)(注意方法中也能定義類(lèi)),不能加訪問(wèn)修飾符。另外,方法內(nèi)部的類(lèi)也不是在調(diào)用方法時(shí)才會(huì)創(chuàng)建的,它們一樣也被事先編譯了。

(6)靜態(tài)內(nèi)部類(lèi)

定義靜態(tài)內(nèi)部類(lèi):在定義內(nèi)部類(lèi)的時(shí)候,可以在其前面加上一個(gè)權(quán)限修飾符static。此時(shí)這個(gè)內(nèi)部類(lèi)就變?yōu)榱遂o態(tài)內(nèi)部類(lèi)。

通常稱(chēng)為嵌套類(lèi),當(dāng)內(nèi)部類(lèi)是static時(shí),意味著:

[1]要?jiǎng)?chuàng)建嵌套類(lèi)的對(duì)象,并不需要其外圍類(lèi)的對(duì)象;

[2]不能從嵌套類(lèi)的對(duì)象中訪問(wèn)非靜態(tài)的外圍類(lèi)對(duì)象(不能夠從靜態(tài)內(nèi)部類(lèi)的對(duì)象中訪問(wèn)外部類(lèi)的非靜態(tài)成員);

嵌 套類(lèi)與普通的內(nèi)部類(lèi)還有一個(gè)區(qū)別:普通內(nèi)部類(lèi)的字段與方法,只能放在類(lèi)的外部層次上,所以普通的內(nèi)部類(lèi)不能有static數(shù)據(jù)和static字段, 也不能包含嵌套類(lèi)。但是在嵌套類(lèi)里可以包含所有這些東西。也就是說(shuō),在非靜態(tài)內(nèi)部類(lèi)中不可以聲明靜態(tài)成員,只有將某個(gè)內(nèi)部類(lèi)修飾為靜態(tài)類(lèi),然后才能夠在這 個(gè)類(lèi)中定義靜態(tài)的成員變量與成員方法。

另外,在創(chuàng)建靜態(tài)內(nèi)部類(lèi)時(shí)不需要將靜態(tài)內(nèi)部類(lèi)的實(shí)例綁定在外部類(lèi)的實(shí)例上。普通非靜態(tài)內(nèi)部類(lèi)的 對(duì)象是依附在外部類(lèi)對(duì)象之中的,要在一個(gè)外部類(lèi)中定義一個(gè)靜態(tài)的內(nèi)部類(lèi),不需要利用關(guān)鍵字new來(lái)創(chuàng)建內(nèi)部類(lèi)的實(shí)例。靜態(tài)類(lèi)和方法只屬于類(lèi)本身,并不屬于 該類(lèi)的對(duì)象,更不屬于其他外部類(lèi)的對(duì)象。

(7)內(nèi)部類(lèi)標(biāo)識(shí)符

每個(gè)類(lèi)會(huì)產(chǎn)生一個(gè).class文件,文件名即為類(lèi)名。同樣,內(nèi)部類(lèi)也會(huì)產(chǎn)生這么一個(gè).class文件,但是它的名稱(chēng)卻不是內(nèi)部類(lèi)的類(lèi)名,而是有著嚴(yán)格的限制:外圍類(lèi)的名字,加上$,再加上內(nèi)部類(lèi)名字。

代碼具體:

public class OutClassTest { static int a; int b; public static void test() { System.out.println('outer class static function'); } public static void main(String[] args) { // new一個(gè)外部類(lèi) OutClassTest oc1 = new OutClassTest(); // 通過(guò)外部類(lèi)的對(duì)象new一個(gè)非靜態(tài)的內(nèi)部類(lèi) OutClassTest.InnerClass no_static_inner = oc1.new InnerClass(); // 調(diào)用非靜態(tài)內(nèi)部類(lèi)的方法 System.out.println(no_static_inner.getKey()); // 調(diào)用靜態(tài)內(nèi)部類(lèi)的靜態(tài)變量 System.out.println(OutClassTest.InnerStaticClass.static_value); // 不依賴(lài)于外部類(lèi)實(shí)例,直接實(shí)例化內(nèi)部靜態(tài)類(lèi) OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass(); // 調(diào)用靜態(tài)內(nèi)部類(lèi)的非靜態(tài)方法 System.out.println(inner.getValue()); // 調(diào)用內(nèi)部靜態(tài)類(lèi)的靜態(tài)方法 System.out.println(OutClassTest.InnerStaticClass.getMessage()); } private class InnerClass { // 只有在靜態(tài)內(nèi)部類(lèi)中才能夠聲明或定義靜態(tài)成員 // private static String tt = '0'; private int flag = 0; public InnerClass() { // 三.非靜態(tài)內(nèi)部類(lèi)的非靜態(tài)成員可以訪問(wèn)外部類(lèi)的非靜態(tài)變量和靜態(tài)變量 System.out.println('InnerClass create a:' + a); System.out.println('InnerClass create b:' + b); System.out.println('InnerClass create flag:' + flag); // System.out.println('InnerClass call outer static function'); // 調(diào)用外部類(lèi)的靜態(tài)方法 test(); } public String getKey() { return 'no-static-inner'; } } private static class InnerStaticClass { // 靜態(tài)內(nèi)部類(lèi)可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類(lèi)則不能有靜態(tài)成員。 private static String static_value = '0'; private int flag = 0; public InnerStaticClass() { System.out.println('InnerClass create a:' + a); // 靜態(tài)內(nèi)部類(lèi)不能夠訪問(wèn)外部類(lèi)的非靜態(tài)成員 // System.out.println('InnerClass create b:' + b); System.out.println('InnerStaticClass flag is ' + flag); System.out.println('InnerStaticClass tt is ' + static_value); } public int getValue() { // 靜態(tài)內(nèi)部類(lèi)訪問(wèn)外部類(lèi)的靜態(tài)方法 test(); return 1; } public static String getMessage() { return 'static-inner'; } } public OutClassTest() { // new一個(gè)非靜態(tài)的內(nèi)部類(lèi) InnerClass ic = new InnerClass(); System.out.println('OuterClass create'); }}

4)靜態(tài)導(dǎo)包

靜態(tài)導(dǎo)包就是java包的靜態(tài)導(dǎo)入,用import static代替import靜態(tài)導(dǎo)入包是JDK1.5中的新特性。

一般我們導(dǎo)入一個(gè)類(lèi)都用 import com…..ClassName;而靜態(tài)導(dǎo)入是這樣:import static com…..ClassName.*;這里的多了個(gè)static,還有就是類(lèi)名ClassName后面多了個(gè).* ,意思是導(dǎo)入這個(gè)類(lèi)里的靜態(tài)方法。當(dāng)然,也可以只導(dǎo)入某個(gè)靜態(tài)方法,只要把 .* 換成靜態(tài)方法名就行了。然后在這個(gè)類(lèi)中,就可以直接用方法名調(diào)用靜態(tài)方法,而不必用ClassName.方法名 的方式來(lái)調(diào)用。

好處:這種方法的好處就是可以簡(jiǎn)化一些操作,例如打印操作System.out.println(…);就可以將其寫(xiě)入一個(gè)靜態(tài)方法print(…),在使用時(shí)直接print(…)就可以了。但是這種方法建議在有很多重復(fù)調(diào)用的時(shí)候使用,如果僅有一到兩次調(diào)用,不如直接寫(xiě)來(lái)的方便

example:

在Java 5中,import語(yǔ)句得到了增強(qiáng),以便提供甚至更加強(qiáng)大的減少擊鍵次數(shù)功能,雖然一些人爭(zhēng)議說(shuō)這是以可讀性為代價(jià)的。這種新的特性成為靜態(tài)導(dǎo)入。當(dāng)你想使用static成員時(shí),可以使用靜態(tài)導(dǎo)入(在API中的類(lèi)和你自己的類(lèi)上,都可以使用該特性)。下面是靜態(tài)導(dǎo)入前后的代碼實(shí)例:

在靜態(tài)導(dǎo)入之前:

public class TestStatic {public static void main(String[] args) {System.out.println(Integer.MAX_VALUE);System.out.println(Integer.toHexString(42));}}

在靜態(tài)導(dǎo)入之后:

import static java.lang.System.out;import static java.lang.Integer.*;public class TestStaticImport {public static void main(String[] args) {out.println(MAX_VALUE);out.println(toHexString(42));}}

讓我們看一下使用靜態(tài)導(dǎo)入特性的代碼中將發(fā)生什么:

1、雖然該特性通常稱(chēng)為“靜態(tài)導(dǎo)入”,但語(yǔ)法必須是import static,后面跟你想導(dǎo)入的static成員的完全限定名稱(chēng),或者通配符。在本例中,我們?cè)赟ystem類(lèi)的out對(duì)象上進(jìn)行靜態(tài)導(dǎo)入。

2、在本例中,我們可能想使用java.lang.Integer類(lèi)的幾個(gè)static成員。該靜態(tài)導(dǎo)入語(yǔ)句使用通配符來(lái)表達(dá)“我想在此類(lèi)中的所有靜態(tài)成員上進(jìn)行靜態(tài)導(dǎo)入”。

3、現(xiàn)在我們終于看到靜態(tài)導(dǎo)入特性的好處!我們不必在System.out.println中鍵入System。太好了!另外,我們不必在Integer.MAX_VALUE中鍵入Integer。因此,在這行代碼中,我們能夠?qū)⒖旖莘绞接糜陟o態(tài)方法和一個(gè)常量。

4、最后,我們進(jìn)行更多的快捷操作,這次針對(duì)Integer類(lèi)的方法。

關(guān)于該特性,我們已經(jīng)有點(diǎn)兒諷刺意味兒了,但不僅我們是這樣的。我們不認(rèn)為節(jié)省少量的擊鍵次數(shù)會(huì)讓代碼

難于閱讀一點(diǎn),但許多開(kāi)發(fā)人員要求將它添加到語(yǔ)言中。

下面是使用靜態(tài)導(dǎo)入的幾條原則:

你必須說(shuō)import static, 不能說(shuō)static import。

提防含糊不清的命名static成員。例如,如果你對(duì)Integer類(lèi)和Long類(lèi)執(zhí)行了靜態(tài)導(dǎo)入,引用MAX_VALUE將導(dǎo)致一個(gè)編譯器錯(cuò)誤,因?yàn)镮nteger和Long都有一個(gè)MAX_VALUE常量,并且Java不會(huì)知道你在引用哪個(gè)MAX_VALUE。

你可以在static對(duì)象引用、常量(記住,它們是static 或final)和static方法上進(jìn)行靜態(tài)導(dǎo)入。

二.static關(guān)鍵字的誤區(qū)

1.static關(guān)鍵字會(huì)改變類(lèi)中成員的訪問(wèn)權(quán)限嗎?

有些初學(xué)的朋友會(huì)將java中的static與C/C++中的static關(guān)鍵字的功能混淆了。在這里只需要記住一點(diǎn):與C/C++中的static不同,Java中的static關(guān)鍵字不會(huì)影響到變量或者方法的作用域。在Java中能夠影響到訪問(wèn)權(quán)限的只有private、public、protected(包括包訪問(wèn)權(quán)限)這幾個(gè)關(guān)鍵字。看下面的例子就明白了:

詳解JAVA中static的作用

2.能通過(guò)this訪問(wèn)靜態(tài)成員變量嗎?

雖然對(duì)于靜態(tài)方法來(lái)說(shuō)沒(méi)有this,那么在非靜態(tài)方法中能夠通過(guò)this訪問(wèn)靜態(tài)成員變量嗎?先看下面的一個(gè)例子,這段代碼輸出的結(jié)果是什么?

public class Main { static int value = 33; public static void main(String[] args) throws Exception{ new Main().printValue(); } private void printValue(){ int value = 3; System.out.println(this.value); }

輸出

33

這里面主要考察隊(duì)this和static的理解。this代表什么?this代表當(dāng)前對(duì)象,那么通過(guò)new Main()來(lái)調(diào)用printValue的話,當(dāng)前對(duì)象就是通過(guò)new Main()生成的對(duì)象。而static變量是被對(duì)象所享有的,因此在printValue中的this.value的值毫無(wú)疑問(wèn)是33。在printValue方法內(nèi)部的value是局部變量,根本不可能與this關(guān)聯(lián),所以輸出結(jié)果是33。在這里永遠(yuǎn)要記住一點(diǎn):靜態(tài)成員變量雖然獨(dú)立于對(duì)象,但是不代表不可以通過(guò)對(duì)象去訪問(wèn),所有的靜態(tài)方法和靜態(tài)變量都可以通過(guò)對(duì)象訪問(wèn)(只要訪問(wèn)權(quán)限足夠)。

3.static能作用于局部變量么?

在C/C++中static是可以作用域局部變量的,但是在Java中切記:static是不允許用來(lái)修飾局部變量。不要問(wèn)為什么,這是Java語(yǔ)法的規(guī)定。

三.常見(jiàn)的筆試面試題

下面列舉一些面試筆試中經(jīng)常遇到的關(guān)于static關(guān)鍵字的題目,僅供參考,如有補(bǔ)充歡迎下方留言。

1.下面這段代碼的輸出結(jié)果是什么?

public class Test extends Base{ static{ System.out.println('test static'); } public Test(){ System.out.println('test constructor'); } public static void main(String[] args) { new Test(); }} class Base{ static{ System.out.println('base static'); } public Base(){ System.out.println('base constructor'); }}

base statictest staticbase constructortest constructor

至于為什么是這個(gè)結(jié)果,我們先不討論,先來(lái)想一下這段代碼具體的執(zhí)行過(guò)程,在執(zhí)行開(kāi)始,先要尋找到main方法,因?yàn)閙ain方法是程序的入口,但是在執(zhí)行main方法之前,必須先加載Test類(lèi),而在加載Test類(lèi)的時(shí)候發(fā)現(xiàn)Test類(lèi)繼承自Base類(lèi),因此會(huì)轉(zhuǎn)去先加載Base類(lèi),在加載Base類(lèi)的時(shí)候,發(fā)現(xiàn)有static塊,便執(zhí)行了static塊。在Base類(lèi)加載完成之后,便繼續(xù)加載Test類(lèi),然后發(fā)現(xiàn)Test類(lèi)中也有static塊,便執(zhí)行static塊。在加載完所需的類(lèi)之后,便開(kāi)始執(zhí)行main方法。在main方法中執(zhí)行new Test()的時(shí)候會(huì)先調(diào)用父類(lèi)的構(gòu)造器,然后再調(diào)用自身的構(gòu)造器。因此,便出現(xiàn)了上面的輸出結(jié)果。

2.這段代碼的輸出結(jié)果是什么?

public class Test { Person person = new Person('Test'); static{ System.out.println('test static'); } public Test() { System.out.println('test constructor'); } public static void main(String[] args) { new MyClass(); }} class Person{ static{ System.out.println('person static'); } public Person(String str) { System.out.println('person '+str); }} class MyClass extends Test { Person person = new Person('MyClass'); static{ System.out.println('myclass static'); } public MyClass() { System.out.println('myclass constructor'); }}

test staticmyclass staticperson staticperson Testtest constructorperson MyClassmyclass constructor

類(lèi)似地,我們還是來(lái)想一下這段代碼的具體執(zhí)行過(guò)程。首先加載Test類(lèi),因此會(huì)執(zhí)行Test類(lèi)中的static塊。接著執(zhí)行new MyClass(),而MyClass類(lèi)還沒(méi)有被加載,因此需要加載MyClass類(lèi)。在加載MyClass類(lèi)的時(shí)候,發(fā)現(xiàn)MyClass類(lèi)繼承自Test類(lèi),但是由于Test類(lèi)已經(jīng)被加載了,所以只需要加載MyClass類(lèi),那么就會(huì)執(zhí)行MyClass類(lèi)的中的static塊。在加載完之后,就通過(guò)構(gòu)造器來(lái)生成對(duì)象。而在生成對(duì)象的時(shí)候,必須先初始化父類(lèi)的成員變量,因此會(huì)執(zhí)行Test中的Person person = new Person(),而Person類(lèi)還沒(méi)有被加載過(guò),因此會(huì)先加載Person類(lèi)并執(zhí)行Person類(lèi)中的static塊,接著執(zhí)行父類(lèi)的構(gòu)造器,完成了父類(lèi)的初始化,然后就來(lái)初始化自身了,因此會(huì)接著執(zhí)行MyClass中的Person person = new Person(),最后執(zhí)行MyClass的構(gòu)造器。

3.這段代碼的輸出結(jié)果是什么?

public class Test { static{ System.out.println('test static 1'); } public static void main(String[] args) { } static{ System.out.println('test static 2'); }}

test static 1test static 2

以上就是詳解JAVA中static的作用的詳細(xì)內(nèi)容,更多關(guān)于JAVA STATIC作用的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区二区三区中文字幕| 成人va天堂| 国产精品magnet| 毛片在线网站| 日韩久久一区| 狠狠干成人综合网| 日韩av一级片| 午夜久久黄色| 国产精品久一| 国产自产自拍视频在线观看| 99久久婷婷这里只有精品| 三级在线观看一区二区| 精品五月天堂| 日韩一区欧美二区| 捆绑调教美女网站视频一区| 激情久久中文字幕| 久久狠狠亚洲综合| 国产超碰精品| 日韩高清不卡在线| 日韩免费av| 日韩av电影一区| 欧美国产日本| 日韩免费视频| 日韩av自拍| 欧美天堂视频| sm捆绑调教国产免费网站在线观看| 韩日一区二区| 粉嫩av一区二区三区四区五区 | 精品久久久网| 国产精品主播在线观看| 蜜桃久久久久久| 蜜臀av免费一区二区三区| 福利一区二区免费视频| 精品精品99| 99国产成+人+综合+亚洲欧美| 亚洲欧洲一区二区天堂久久| 日本亚洲不卡| 国产一区福利| 午夜在线一区| 国产一区二区三区成人欧美日韩在线观看| 色爱综合网欧美| 爽好多水快深点欧美视频| 91伊人久久| 国产高清不卡| 日本久久一区| 亚洲天堂成人| 久久精品xxxxx| 99riav1国产精品视频| 国产精品麻豆成人av电影艾秋 | 成人在线视频免费| 国产一在线精品一区在线观看| 国产精品久久777777毛茸茸| 日本不良网站在线观看| 深夜日韩欧美| 日本在线成人| 国产亚洲精品美女久久久久久久久久| 波多野结衣久久精品| 国产精品成人国产| 亚洲精品激情| 亚洲性视频在线| 国产调教精品| 国产情侣一区在线| 国产麻豆一区二区三区精品视频| 日韩精品一二三区| 亚洲国内精品| 国产成人免费| 国模精品一区| 亚洲国产欧美日本视频| 久久这里只有精品一区二区| 国产精品国码视频| 国产成人a视频高清在线观看| 久久精品超碰| 国内精品麻豆美女在线播放视频| 成人午夜亚洲| 欧美~级网站不卡| 亚洲毛片在线| 久久的色偷偷| 久久亚洲成人| 国产亚洲高清视频| 亚洲资源网站| 精品视频一区二区三区在线观看| 精品视频亚洲| 99久精品视频在线观看视频| 伊人久久婷婷| 国产粉嫩在线观看| 国产亚洲高清在线观看| 99综合视频| 成人精品久久| 亚洲视频电影在线| 欧美综合二区| 亚洲a级精品| 久久uomeier| 国产精品久久久久9999高清| 9999国产精品| 亚洲欧洲美洲国产香蕉| 日韩中文影院| 日本成人一区二区| 欧美a一区二区| 国产模特精品视频久久久久| 国产日产精品_国产精品毛片 | 国产精品精品| 亚洲三级毛片| 亚洲影院天堂中文av色| 亚洲一区二区三区高清| 国产a久久精品一区二区三区| 国产精品一区二区免费福利视频| japanese国产精品| 欧美日韩国产综合网| 欧美xxxx中国| 亚洲一区二区三区四区五区午夜| 激情不卡一区二区三区视频在线| 欧美三区不卡| 99精品美女| 日韩国产一二三区| 欧美1区二区| 伊人国产精品| 99久久亚洲精品蜜臀| 国产视频一区二| 亚洲欧美激情诱惑| 日本蜜桃在线观看视频| 午夜性色一区二区三区免费视频| 水蜜桃精品av一区二区| 免费观看在线综合色| 韩国女主播一区二区三区| 视频一区在线视频| 伊人久久高清| 精品国产午夜肉伦伦影院| 色综合视频一区二区三区日韩| 日韩欧美自拍| 99国产精品| av资源亚洲| 四虎成人av| 久久久精品区| 国产精品一区二区中文字幕| 亚洲久久一区| 免费精品视频最新在线| 欧美日韩国产免费观看视频| 麻豆中文一区二区| 日韩福利视频一区| 久久最新视频| 五月综合激情| 午夜免费一区| 久久在线免费| 狠狠色综合网| 国产精品99在线观看| 国产精久久久| 蜜桃精品视频| 欧美激情一区| 色欧美自拍视频| 日韩中文影院| 日韩av免费| 在线视频免费在线观看一区二区| 色老板在线视频一区二区| 国产一区二区亚洲| 国产一区二区视频在线看| 丰满少妇一区| 日韩在线短视频| 最新亚洲一区| 四虎精品一区二区免费| 亚洲一级大片| 国产精品66| 日韩国产一区| 欧美特黄一级| 日韩黄色在线观看| 国产毛片精品| 午夜精品久久久久久久久久蜜桃| 日本精品一区二区三区在线观看视频| 日本久久一区| 成人在线丰满少妇av| 欧美丝袜一区| 欧美日韩99| 99成人在线视频| 久久亚洲风情| 青草综合视频| 国产精品一区二区三区美女| 久久精品国产在热久久| 国产综合婷婷| 国产精品乱战久久久| 影视先锋久久| 欧美有码在线| 亚洲手机在线| 国产精品一区二区三区四区在线观看 | 尤物在线精品| 国产精品chinese| 日本少妇一区| 麻豆精品视频在线观看| 99久久亚洲精品| 日韩精品视频一区二区三区| 91精品综合| 国产精成人品2018| 日本成人精品| 日韩精品一级中文字幕精品视频免费观看 | 动漫av一区| 日韩国产欧美三级| 99精品视频在线| 麻豆视频一区二区| 蜜臀av在线播放一区二区三区| 国产乱论精品| 久久成人av| 国产 日韩 欧美 综合 一区|