欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中staticclass靜態(tài)類詳解

 更新時間:2017年12月07日 10:54:16   作者:風(fēng)生水起  
這篇文章主要介紹了java中staticclass靜態(tài)類詳解,具有一定借鑒價值,需要的朋友可以了解下。

一般情況下是不可以用static修飾類的。如果一定要用static修飾類的話,通常static修飾的是匿名內(nèi)部類。

在一個類中創(chuàng)建另外一個類,叫做成員內(nèi)部類。這個成員內(nèi)部類可以靜態(tài)的(利用static關(guān)鍵字修飾),也可以是非靜態(tài)的。由于靜態(tài)的內(nèi)部類在定義、使用的時候會有種種的限制。所以在實際工作中用到的并不多。

在開發(fā)過程中,內(nèi)部類中使用的最多的還是非靜態(tài)地成員內(nèi)部類。不過在特定的情況下,靜態(tài)內(nèi)部類也能夠發(fā)揮其獨特的作用。

一、靜態(tài)內(nèi)部類的使用目的。

在定義內(nèi)部類的時候,可以在其前面加上一個權(quán)限修飾符static。此時這個內(nèi)部類就變?yōu)榱遂o態(tài)內(nèi)部類。不過由于種種的原因,如使用上的限制等等因素(具體的使用限制,筆者在下面的內(nèi)容中會詳細闡述),在實際工作中用的并不是很多。但是并不是說其沒有價值。在某些特殊的情況下,少了這個靜態(tài)內(nèi)部類還真是不行。如在進行代碼程序測試的時候,如果在每一個Java源文件中都設(shè)置一個主方法(主方法是某個應(yīng)用程序的入口,必須具有),那么會出現(xiàn)很多額外的代碼。而且最主要的時這段主程序的代碼對于Java文件來說,只是一個形式,其本身并不需要這種主方法。但是少了這個主方法又是萬萬不行的。在這種情況下,就可以將主方法寫入到靜態(tài)內(nèi)部類中,從而不用為每個Java源文件都設(shè)置一個類似的主方法。這對于代碼測試是非常有用的。在一些中大型的應(yīng)用程序開發(fā)中,則是一個常用的技術(shù)手段。為此,這個靜態(tài)內(nèi)部類雖然不怎么常用,但是程序開發(fā)人員還必須要掌握它。也許在某個關(guān)鍵的時刻,其還可以發(fā)揮巨大的作用也說不定。

public class MainInStaticClass {
	static class Main{
		static void main() {
			//將主方法寫到靜態(tài)內(nèi)部類中,從而不必為每個源文件都這種一個類似的主方法
			new MainInStaticClass().print();
		}
	}
	public static void main(String[] args){
		new MainInStaticClass().print();
	}
	public void print(){
		System.out.println("main in static inner class");
	}
}
public class TestMain {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// new MainInStaticClass().print();
		MainInStaticClass.Main.main();
		new MainInStaticClass.Main();
	}
}

二、靜態(tài)內(nèi)部類的使用限制。

將某個內(nèi)部類定義為靜態(tài)類,跟將其他類定義為靜態(tài)類的方法基本相同,引用規(guī)則也基本一致。不過其細節(jié)方面仍然有很大的不同。具體來說,主要有如下幾個地方要引起各位程序開發(fā)人員的注意。

一是靜態(tài)成員(包括靜態(tài)變量與靜態(tài)成員)的定義。一般情況下,如果一個內(nèi)部類不是被定義成靜態(tài)內(nèi)部類,那么在定義成員變量或者成員方法的時候,是不能夠被定義成靜態(tài)成員變量與靜態(tài)成員方法的。也就是說,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員。如現(xiàn)在在一個student類中定義了一個內(nèi)部類age,如果沒有將這個類利用static關(guān)鍵字修飾,即沒有定義為靜態(tài)類,那么在這個內(nèi)部類中如果要利用static關(guān)鍵字來修飾某個成員方法或者成員變量是不允許的。在編譯的時候就通不過。故程序開發(fā)人員需要注意,只有將某個內(nèi)部類修飾為靜態(tài)類,然后才能夠在這個類中定義靜態(tài)的成員變量與成員方法。這是靜態(tài)內(nèi)部類都有的一個特性。也正是因為這個原因,有時候少了這個靜態(tài)的內(nèi)部類,很多工作就無法完成?;蛘哒f要繞一個大圈才能夠?qū)崿F(xiàn)某個用戶的需求。這也是靜態(tài)的內(nèi)部類之所以要存在的一個重要原因。

二是在成員的引用上,有比較大的限制。一般的非靜態(tài)內(nèi)部類,可以隨意的訪問外部類中的成員變量與成員方法。即使這些成員方法被修飾為private(私有的成員變量或者方法),其非靜態(tài)內(nèi)部類都可以隨意的訪問。則是非靜態(tài)內(nèi)部類的特權(quán)。因為在其他類中是無法訪問被定義為私有的成員變量或則方法。但是如果一個內(nèi)部類被定義為靜態(tài)的,那么在銀用外部類的成員方法或則成員變量的時候,就會有諸多的限制。如不能夠從靜態(tài)內(nèi)部類的對象中訪問外部類的非靜態(tài)成員(包括成員變量與成員方法)。這是什么意思呢?如果在外部類中定義了兩個變量,一個是非靜態(tài)的變量,一個是靜態(tài)的變量。那么在靜態(tài)內(nèi)部類中,無論在成員方法內(nèi)部還是在其他地方,都只能夠引用外部類中的靜態(tài)的變量,而不能夠訪問非靜態(tài)的變量。在靜態(tài)內(nèi)部類中,可以定義靜態(tài)的方法(也只有在靜態(tài)的內(nèi)部類中可以定義靜態(tài)的方法),在靜態(tài)方法中引用外部類的成員。但是無論在內(nèi)部類的什么地方引用,有一個共同點,即都只能夠引用外部類中的靜態(tài)成員方法或者成員變量。對于那些非靜態(tài)的成員變量與成員方法,在靜態(tài)內(nèi)部類中是無法訪問的。這就是靜態(tài)內(nèi)部類的最大使用限制。在普通的非靜態(tài)內(nèi)部類中是沒有這個限制的。也正是這個原因,決定了靜態(tài)內(nèi)部類只應(yīng)用在一些特定的場合。其應(yīng)用范圍遠遠沒有像非靜態(tài)的內(nèi)部類那樣廣泛。

三是在創(chuàng)建靜態(tài)內(nèi)部類時不需要將靜態(tài)內(nèi)部類的實例綁定在外部類的實例上。

通常情況下,在一個類中創(chuàng)建成員內(nèi)部類的時候,有一個強制性的規(guī)定,即內(nèi)部類的實例一定要綁定在外部類的實例中。也就是說,在創(chuàng)建內(nèi)部類之前要先在外部類中要利用new關(guān)鍵字來創(chuàng)建這個內(nèi)部類的對象。如此的話如果從外部類中初始化一個內(nèi)部類對象,那么內(nèi)部類對象就會綁定在外部類對象上。也就是說,普通非靜態(tài)內(nèi)部類的對象是依附在外部類對象之中的。但是,如果成員開發(fā)人員創(chuàng)建的時靜態(tài)內(nèi)部類,那么這就又另當(dāng)別論了。通常情況下,程序員在定義靜態(tài)內(nèi)部類的時候,是不需要定義綁定在外部類的實例上的。也就是說,要在一個外部類中定義一個靜態(tài)的內(nèi)部類,不需要利用關(guān)鍵字new來創(chuàng)建內(nèi)部類的實例。即在創(chuàng)建靜態(tài)類內(nèi)部對象時,不需要其外部類的對象。

newMainInStaticClass.Main();

具體為什么會這樣,一般程序開發(fā)人員不需要了解這么深入,只需要記住有這個規(guī)則即可。在定義靜態(tài)內(nèi)部類的時候,千萬不要犯畫蛇添足的錯誤。

從以上的分析中可以看出,靜態(tài)內(nèi)部類與非靜態(tài)的內(nèi)部類還是有很大的不同的。一般程序開發(fā)人員可以這么理解,非靜態(tài)的內(nèi)部類對象隱式地在外部類中保存了一個引用,指向創(chuàng)建它的外部類對象。不管這么理解,程序開發(fā)人員都需要牢記靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的差異。如是否可以創(chuàng)建靜態(tài)的成員方法與成員變量(靜態(tài)內(nèi)部類可以創(chuàng)建靜態(tài)的成員而非靜態(tài)的內(nèi)部類不可以)、對于訪問外部類的成員的限制(靜態(tài)內(nèi)部類只可以訪問外部類中的靜態(tài)成員變量與成員方法而非靜態(tài)的內(nèi)部類即可以訪問靜態(tài)的也可以訪問非靜態(tài)的外部類成員方法與成員變量)。這兩個差異是靜態(tài)內(nèi)部類與非靜態(tài)外部類最大的差異,也是靜態(tài)內(nèi)部類之所以存在的原因。了解了這個差異之后,程序開發(fā)人員還需要知道,在什么情況下該使用靜態(tài)內(nèi)部類。如在程序測試的時候,為了避免在各個Java源文件中書寫主方法的代碼,可以將主方法寫入到靜態(tài)內(nèi)部類中,以減少代碼的書寫量,讓代碼更加的簡潔。

總之,靜態(tài)內(nèi)部類在Java語言中是一個很特殊的類,跟普通的靜態(tài)類以及非靜態(tài)的內(nèi)部類都有很大的差異。作為程序開發(fā)人員,必須要知道他們之間的差異,并在實際工作中在合適的地方采用合適的類。不過總的來說,靜態(tài)內(nèi)部類的使用頻率并不是很高。但是在有一些場合,如果沒有這個內(nèi)部靜態(tài)類的話,可能會起到事倍功半的反面效果

三、實例化

看了以上內(nèi)容后,下面我整體測試了一下:

首先大家需要明白,靜態(tài)內(nèi)部類只是不依附與外部類,它里面的變量和方法也沒有說一定得是靜態(tài)的,下面拿代碼說事:

public class Test {
	public static void main(String[] args){
		MyInnerStaticClass inner=new MyInnerStaticClass();
		inner.a=10;
		inner.b="abc";
		System.out.println(inner.a+" "+inner.b);
	}
	static class MyInnerStaticClass{
		int a;
		String b;
	}
}
public class Test {
	public static void main(String[] args){
		MyInnerStaticClass inner=new MyInnerStaticClass();
		inner.a=10;
		inner.b="abc";
		System.out.println(inner.a+" "+inner.b);
	}
	static class MyInnerStaticClass{
		int a;
		String b;
	}
}

上述代碼將靜態(tài)匿名類用new實例化了,運行后輸入10 abc,正確!

總結(jié)

以上就是本文關(guān)于java中staticclass靜態(tài)類詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 基于JAVA代碼 獲取手機基本信息(本機號碼,SDK版本,系統(tǒng)版本,手機型號)

    基于JAVA代碼 獲取手機基本信息(本機號碼,SDK版本,系統(tǒng)版本,手機型號)

    本文給大家介紹基于java代碼獲取手機基本信息,包括獲取電話管理對象、獲取手機號碼、獲取手機型號、獲取SDK版本、獲取系統(tǒng)版本等相關(guān)信息,對本文感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Java中LinkedHashSet的源碼剖析

    Java中LinkedHashSet的源碼剖析

    這篇文章主要介紹了Java中LinkedHashSet的源碼剖析,LinkedHashSet是HashSet的子類,LinkedHashSet底層是一個LinkedHashMap,底層維護了一個數(shù)組+雙向鏈表,需要的朋友可以參考下
    2023-09-09
  • Java超詳細整理講解各種排序

    Java超詳細整理講解各種排序

    這篇文章主要介紹了Java常用的排序算法及代碼實現(xiàn),在Java開發(fā)中,對排序的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時候能夠有扎實的基礎(chǔ)能力。那Java有哪些排序算法呢?本文小編就來詳細說說Java常見的排序算法,需要的朋友可以參考一下
    2022-07-07
  • 基于自定義校驗注解(controller、method、(groups)分組的使用)

    基于自定義校驗注解(controller、method、(groups)分組的使用)

    這篇文章主要介紹了基于自定義校驗注解(controller、method、(groups)分組的使用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實現(xiàn)MD5加密的方式與實例代碼

    Java實現(xiàn)MD5加密的方式與實例代碼

    MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上。那么它到底有什么,又什么好處呢,會被這么廣泛的運用在應(yīng)用開發(fā)中
    2021-10-10
  • Java實現(xiàn)生成JSON字符串的三種方式分享

    Java實現(xiàn)生成JSON字符串的三種方式分享

    這篇文章主要來和大家分享一下Java實現(xiàn)生成JSON字符串的常見三種方式,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,需要的可以參考一下
    2023-05-05
  • Java中的SkyWalking監(jiān)控告警詳解

    Java中的SkyWalking監(jiān)控告警詳解

    這篇文章主要介紹了Java中的SkyWalking監(jiān)控告警詳解,SkyWalking在6.x版本中新增了告警功能,其核心在于config/alarm-settings.yaml文件中,該文件分為rules和webhooks兩部分,需要的朋友可以參考下
    2023-11-11
  • 詳解Java中類的加載順序

    詳解Java中類的加載順序

    Java中什么時候類加載,第一次需要使用類信息時加載。類加載的原則:延遲加載,能不加載就不加載。下面這篇文章主要介紹了Java中類的加載順序,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • java調(diào)用通義千問API的詳細完整步驟

    java調(diào)用通義千問API的詳細完整步驟

    通義千問是阿里云自主研發(fā)的大語言模型,能夠在用戶自然語言輸入的基礎(chǔ)上,通過自然語言理解和語義分析,理解用戶意圖,在不同領(lǐng)域、任務(wù)內(nèi)為用戶提供服務(wù)和幫助,下面這篇文章主要給大家介紹了關(guān)于java調(diào)用通義千問API的詳細完整步驟,需要的朋友可以參考下
    2024-02-02
  • Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解

    Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解

    微服務(wù)架構(gòu)下,?個微服務(wù)往往部署多個實例,如果每次只能查看單個實例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場景下,我們可以使??Hystrix?Turbine?進?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控數(shù)據(jù)聚合在?起,便于查看
    2022-09-09

最新評論