1. 程式人生 > >java中的靜態類和巢狀類

java中的靜態類和巢狀類

在Java中類可以是靜態的麼?

在Java中類可以是靜態的。在Java中有靜態例項變數,靜態方法,以及靜態塊,類也可以是靜態的。在Java中我們可以在類中再次定義一個類。這種類被稱為巢狀類。巢狀類外圍的類被稱為外部類。在Java中不能使最頂層類為靜態類,而只有巢狀的類可以是靜態類

靜態類與非靜態類的區別?

下面列出了靜態類與非靜態類的主要區別。非靜態巢狀類通常被稱為內部類。

  1. 巢狀靜態類不需要外部類的引用,但是非靜態巢狀類或者內部類需要外部類的引用。(Nested static class doesn’t need reference of Outer class, but Non-static nested class or Inner class requires Outer class reference.
    )
  2. 內部類(非靜態巢狀類)可以訪問外部類的靜態與非靜態成員。靜態類不能夠訪問外部類的非靜態成員。
  3. 建立內部類的例項,在沒有外部類的例項時,無法建立。內部類可引用其所在外部類的資料與方法。因此我們不需要傳遞物件的引用給內部類的構造器。因為這一點,內部類使得程式變得更簡潔。
  1. class OuterClass{  
  2.     privatestatic String msg = "GeeksForGeeks";  
  3.     private String nonStaticMsg = "nonStaticGeeksForGeeks";  
  4.     // 靜態巢狀類
  5.     public
    staticclass NestedStaticClass{  
  6.         // 只有外部類的靜態稱為可以在該靜態類中訪問
  7.         publicvoid printMessage(){  
  8.             System.out.println("Message from nested static class: " + msg);  
  9.             // 報錯,因為在靜態類中訪問非靜態成員nonStaticMsg
  10. //          System.out.println("Message from nested static class: " + nonStaticMsg);
  11.         }  
  12.     }  
  13.     publicclass InnerClass{  
  14.         publicvoid display(){  
  15.             // 內部類中,靜態與非靜態成員都可以訪問。
  16.             System.out.println("Message from nested static class: " + msg);  
  17.             System.out.println("Message from nested static class: " + nonStaticMsg);  
  18.         }  
  19.     }  
  20. }  
  21. publicclass App   
  22. {  
  23.     publicstaticvoid main( String[] args )  
  24.     {  
  25.         // 建立巢狀靜態類的例項
  26.         OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();  
  27.         printer.printMessage();  
  28.         // 為了建立內部類的例項,我們需要一個外部類的例項
  29.         OuterClass outer = new OuterClass();  
  30.         OuterClass.InnerClass inner = outer.new InnerClass();  
  31.         // 呼叫內部類的非靜態方法
  32.         inner.display();  
  33.         // 還可以用以一步來建立內部類的例項
  34.         OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();  
  35.         innerObject.display();  
  36.     }  
  37. }  
  1. class Outer{  
  2.     publicstaticclass StaticInner{   
  3.     }  
  4.     publicclass Inner{  
  5.     }     
  6.     publicstaticvoid test(){  
  7.         Inner it1 = new Inner();   // 報錯,需要建立Outer,然後通過Outer建立Inner的例項
  8.         StaticInner st = new StaticInner();  
  9.     }  
  10.     publicvoid test2(){  
  11.         Inner it2 = new Inner();  
  12.     }  
  13. }  


巢狀類 在Java中,巢狀類是定義在另一個類內部的類。
使用巢狀類的目的是將外部類與巢狀類清晰地組織在一起,並表示這兩個類是一起使用的。或者,巢狀類僅僅在內部被外圍類所使用。
Java開發者通常將巢狀類視為內部類,但內部類(非靜態巢狀類)僅僅是Java中幾種不同巢狀類中的一種。

在Java中,巢狀類被看作是外圍類的成員。這樣,巢狀類可以用public,package(無訪問修飾符),protected及private來修飾。因此,Java中的巢狀類可以被子類繼承。
在Java中你可以建立幾種不同型別的巢狀類。它們是:
  • 靜態巢狀類
  • 非靜態巢狀類
  • 區域性類
  • 匿名類

靜態巢狀類

靜態巢狀類是以如下形式宣告的:

  1. publicclass Outer {  
  2.   publicstaticclass Nested {  
  3.   }  
  4. }  
為了建立巢狀類的例項,你必須以外部類Outer作為類Nested的字首來引用它。Outer.Nested instance = new Outer.Nested();由於是靜態的,靜態巢狀類只能通過一個其外層類的例項的引用來訪問外部類例項。

非靜態巢狀類(內部類)

在java中非靜態巢狀類被稱為內部類。內部類是與一個外部類例項相關聯。必須先建立外部類例項,隨後才能建立內部類。

  1. publicclass Outer {  
  2.   publicclass Inner {  
  3.   }  
  4. }  
  5. Outer outer = new Outer();  
  6. Outer.Inner inner = outer.new Inner();  

非靜態巢狀類(內部類)能夠訪問外部類的域,即使它們被宣告為private.
  1. publicclass Outer {  
  2.     private String text = "I am private!";  
  3.     publicclass Inner {  
  4.         publicvoid printText() {  
  5.             System.out.println(text);  
  6.         }  
  7.     }  
  8. }  
  9. //printText中引用了一個Outer類中private成員text.這是可以的。下面是printText的呼叫方式。
  10. Outer outer = new Outer();  
  11. Outer.Inner inner = outer.new Inner();  
  12. inner.printText();  

內部類作用域遮蔽

如果內部類宣告的域或方法與外圍類有相同的名字,內部域或方法會遮蔽外部類的域或方法。

  1. publicclass Outer {  
  2.     private String text = "I am Outer private!"

    相關推薦

    java靜態

    在Java中類可以是靜態的麼? 在Java中類可以是靜態的。在Java中有靜態例項變數,靜態方法,以及靜態塊,類也可以是靜態的。在Java中我們可以在類中再次定義一個類。這種類被稱為巢狀類。巢狀類外圍的類被稱為外部類。在Java中不能使最頂層類為靜態類,而只

    C/C++ 區域性

    class Interface { public: virtual void Fun() = 0; }; template <class T, class P> Interface* MakeAdapter(const T& obj, const P& arg) {

    Java內部類(inner Class)(static inner Class)也就是靜態內部類的區別

    內部類和靜態類有著本質的區別,有點類似普通成員變數和靜態成員變數的區別。 . 內部類可以看成是外部類的普通成員變數,這個成員變數可以使用外部類的屬性(靜態和非靜態),可以呼叫外部類的方法(靜態和非靜態),而且內部類還持有外部類物件作為其自身的一個屬性,這個屬

    Java靜態以及

    原文地址: http://www.geeksforgeeks.org/static-class-in-java/ Java中的靜態類                       http://tutorials.jenkov.com/java/nested-classes.

    Java的內部類(Inner Class)(Nested Class)的區別

    內部類是類中類(內部類不為同一包的其他類可見,具有很好的封裝性),分為靜態內部類,成員內部類,區域性內部類以及匿名內部類;區域性內部類寫在方法裡面;用到最多的就是匿名內部類,例子如下: 首先定義一個介面:Interface A{ public void method();}

    第十章 內部類 內部類

    1.內部類訪問外圍類的成員方法 內部類可以訪問其外圍類的方法和欄位,就像他們自己的一樣。當某個外圍類的物件建立一個內部類物件時,此內部類物件必定會祕密地捕獲一個指向那個外圍類物件的引用。 在訪問此外圍類成員的時候,就用那個引用去訪問外圍類的成員,內部類物件只能在與其外圍類的

    javaclass.forNameclassLoader載入的區分

       java中class.forName和classLoader都可用來對類進行載入。前者除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。而classLoader只幹一件事情,就是將.class檔案載入到jvm中,不會執行stat

    java靜態方法靜態方法的區別

    靜態方法和非靜態方法主要有兩個區別: 1.在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。 2.靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而

    C++語言--友元-8.1----友元

    前言:C++系列到此結束。終於可以寫點簡單的Jni了。感謝自己的努力!!! 友元是一種允許非類成員函式訪問類的非公有成員的一種機制。可以把一個函式指定為類的友元,也可以把整個類指定為另一個類的友

    java靜態資源動態資源的區別

    靜態資源:html,屬於客戶端 動態資源:jsp/servlet屬於伺服器端 一、靜態web頁面: 1、在靜態Web程式中,客戶端使用Web瀏覽器(IE、FireFox等)經過網路(Network)連線到伺服器上,使用HTTP協議發起一個請求(Request),告訴

    java靜態變數成員變數的區別

    所屬不同:靜態變數屬於類,所以也稱為為類變數;成員變數屬於物件,所以也稱為例項變數(物件變數)在記憶體中位置不同:靜態變數儲存於方法區裡的靜態區;成員變數儲存於堆記憶體區在記憶體中出現的時間不同:靜態變

    Java靜態常量靜態變數的區別

    如下:測試java中靜態常量和靜態變數區別的樣例,表明兩者載入時的區別。StaticClass類中定義了靜態常量FIANL_VALUE和靜態變數VALUE,靜態程式碼塊的列印語句表示類被載入:publi

    C#多重IFIF

    1. 多重IF結構 如果IF條件需要分成多種情況時,將要用到多重IF條件的用法,即else –if結構,這的語法如下: If(條件1)   { 語句塊1;    } Else if(條件2)   {       語句塊2;   } …. Else if(條件n)   {   語句塊n;   } [else

    Java靜態變數靜態變數的初始化順序

      先看下面的程式: package c05.net; class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");} void f1() {System.out.println("Ok")

    Java、內部類、靜態內部類

    在Java中我們在一個類的內部再定義一個類,如下所示:class OuterClass { ... class NestedClass { ... } }那麼在上面的例子中我們稱OuterClass為外圍類(enclosing clas

    Java例項說明 包括內部類(即非靜態靜態 兩者的區別

    內部類例項程式碼: public class OuterMyTest {class InnerMyTest{}  public static void main(String[] args) {InnerMyTest innerMyTest = new InnerMyT

    Java學習筆記】靜態內部類

    public class Outer { int outer_x = 100;     class Inner{       public int y = 10;       private int z = 9;       int m = 5;       publ

    Java靜態變量(變量)、實例變量、局部變量成員變量

    Java導讀 學習Java的過程中,一開始很容易被這些各種變量繞暈,這篇博客主要介紹了這幾種變量之間的關系和區別。 例程 package com.cunyu.demo public class Demo { private String name; //成員變量、實例變量 private

    靜態(Static Nested Class)內部類(Inner Class)的不同

    答:Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化,其語法看起來挺詭異的,如下所示。 /**  * 撲克類(一副撲克)  * @author 駱昊  *  */pu

    靜態(Static Nested Class)內部類(Inner Class)

    一. 什麼是巢狀類及內部類? 可以在一個類的內部定義另一個類, 這種類稱為巢狀類(nested classes),它有兩種型別: 靜態巢狀類和非靜態巢狀類.靜態巢狀類使用很少, 最重要的是非靜態巢狀類, 也即是被稱作為 內部類(inner).巢狀類從JDK1.1