⑴ java中靜態內部類是怎麼定義的
需要了解2個概念:內部類和靜態修飾符static
1)首先,用內部類是因為內部類與所在外部類有一定的關系,往往只有該外部類調用此內部類。所以沒有必要專門用一個Java文件存放這個類。
2)靜態都是用來修飾類的內部成員的。比如靜態方法,靜態成員變數,靜態常量。它唯一的作用就是隨著類的載入(而不是隨著對象的產生)而產生,以致可以用類名+靜態成員名直接獲得。
這樣靜態內部類就可以理解了,因為這個類沒有必要單獨存放一個文件,它一般來說只被所在外部類使用。並且它可以直接被用
外部類名+內部類名
獲得。
以下舉例說明怎麼使用:
Student類有個叫School的內部類(非靜態)
Student
stu
=
new
Student();
stu.School
sch
=
new
stu.School();
sch就是School的一個對象。
假如School是內部靜態類:
Student.School
sch
=
new
Student.School();
⑵ java中靜態內部類和內部類的區別
1. 嵌套類的對象,並不需要其外圍類的對象。 即它可以不依賴於外部類實例被實例化。
2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。 這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定
3. 外部類訪問內部類的的成員有些特別, 不能直接訪問, 但可以通過內部類實例來訪問, 這是因為靜態嵌套內的所有成員和方法默認為靜態的了.同時注意, 內部靜態類Person只在類StaticTest 范圍內可見, 若在其它類中引用或初始化, 均是錯誤的.
4 . 靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。
5. 靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數;
6 . 非靜態內部類的非靜態成員可以訪問外部類的非靜態變數。
生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類(正常情況下,你不能在介面內部放置任何代碼,但嵌套類可以作為介面的一部分,因為它是static 的。只是將嵌套類置於介面的命名空間內,這並不違反介面的規則)
⑶ java中的靜態內部類有什麼特點
特點:
1、靜態內部類無需依賴於外部類,它可以獨立於外部對象而存在。
2、靜態內部類,多個外部類的對象可以共享同一個內部類的對象。
3、使用靜態內部類的好處是加強了代碼的封裝性以及提高了代碼的可讀性。
4、普通內部類不能聲明static的方法和變數,注意這里說的是變數,常量(也就是final static修飾的屬性)還是可以的,而靜態內部類形似外部類,沒有任何限制。
有問題歡迎提問,滿意請採納,謝謝!
⑷ java 中靜態內部類欄位什麼時候初始化
不是的,只有在載入內部類的時候才初始化 //有問題可以繼續交神瞎租流x0dx0a樓主只要看懂一下的代碼x0dx0a那麼對於類的載入x0dx0a基本上就沒問神埋題了x0dx0a最後類的載入過程的解釋x0dx0apublic class Test6 {x0dx0a public static void main(String[] args){x0dx0a new B();x0dx0a new A.C();x0dx0a }x0dx0a}x0dx0ax0dx0aclass A{x0dx0a private P p1 = new P("A--p1");x0dx0a static P p3 = new P("A--p3");x0dx0a public A(){x0dx0a System.out.println("A()");x0dx0a }x0dx0a private P p2 =new P("A--p2");x0dx0a static{x0dx0a new P("A--static"); x0dx0a }x0dx0a {new P("A{...}");}x0dx0a x0dx0a public static class C {x0dx0a private P p1 = new P("C--p1");x0dx0a static P p3 = new P("C--p3");x0dx0a public C(){x0dx0a System.out.println("C()");x0dx0a }x0dx0a private P p2 =new P("C--p2");x0dx0a static{x0dx0a new P("C--static"); x0dx0a }x0dx0a {new P("C{...}");}x0dx0a }x0dx0a}x0dx0ax0dx0aclass B extends A {x0dx0a private P p1 = new P("B --p1");x0dx0a static P p3 = new P("B -- p3");x0dx0a public B() {x0dx0a System.out.println("B()"); x0dx0a }x0dx0a public P p2 = new P("B -- p2");x0dx0a static {x0dx0a new P("B -- static");x0dx0a }x0dx0a x0dx0a {new P("B{...}");}x0dx0a}x0dx0ax0dx0aclass P {x0dx0a public P(String s) {x0dx0a System.out.println(s);x0dx0a } x0dx0a}x0dx0a/*x0dx0a x0dx0a有父類的情況x0dx0a1. 載入父類x0dx0a 1.1 為靜態屬性分配存儲空間並賦初始值 x0dx0a 1.2 執行靜態初始化塊和靜態初始化語句(從上至下)x0dx0a2. 載入子類x0dx0a 2.1 為靜態屬性分配存儲空間x0dx0a 2.2 執行靜態游兆初始化塊和靜態初始化語句(從上至下)x0dx0a3. 載入父類構造器x0dx0a 3.1 為實例屬性分配存數空間並賦初始值 x0dx0a 3.2 執行實例初始化塊和實例初始化語句x0dx0a 3.3 執行構造器內容x0dx0a4. 載入子類構造器x0dx0a 4.1 為實例屬性分配存數空間並賦初始值 x0dx0a 4.2 執行實例初始化塊和實例初始化語句x0dx0a 4.3 執行構造器內容x0dx0a5 回到main()x0dx0a內部類的載入過程也一樣x0dx0a*/
⑸ 關於java靜態內部類形式的單例模式
static Singleton instance = new Singleton();
static類型的成員變數,只會在新建類的對象時被執行一次。
所以static Singleton instance = new Singleton(); 只有在第一次調用時,被一次。之後獲取的都是第一次執行的對象。所以稱之為單例。
也可以使用老的寫法,比較清晰一些。
classABC{
privatestaticABCinstance;
privateABC(){}
publicABCgetInstance(){
if(instance==null)
instance=newABC();
returninstance;
}
}
這樣寫法的缺點是效率不如
classABC{
privatestaticABCinstance=newABC();
privateABC(){}
publicABCgetInstance(){
returninstance;
}
}
這樣寫法高。
⑹ Java 靜態內部類的使用
Java語言允許在類中再定義類,這種在其它類內部定義的類就叫內部類。內部類又分為:常規內部類、局部內部類、匿名內部類和靜態嵌套類四種。
1、靜態內部類定義
靜態內部類,定義在類中,任何方法外,用static定義;靜態內部類只能訪問外部類的靜態成員。
生成(new)一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類。可以定義私有靜態內部類。
2、java實現靜態內部類注意事項
將某個內部類定義為靜態類,跟將其他類定義為靜態類的方法基本相同,引用規則也基本一致。不過其細節方面仍然有很大的不同。具體來說,主要有如下幾個地方要引起注意。
1)一般情況下,如果一個內部類不是被定義成靜態內部類,那麼在定義成員變數或者成員方法的時候,是不能夠被定義成靜態成員變數與靜態成員方法的。也就是說,在非靜態內部類中不可以聲明靜態成員
2)一般非靜態外部類可以隨意訪問其外部類的成員變數以及方法(包括聲明為private的方法),但是如果一個內部類被聲明為static,則其在訪問包括自身的外部類會有諸多的限制。靜態內部類不能訪問其外部類的非靜態成員變數和方法
3)在一個類中創建非靜態成員內部類的時候,有一個強制性的規定,即內部類的實例一定要綁定在外部類的實例中。然後要在一個外部類中定義一個靜態的內部類,不需要利用關鍵字new來創建內部類的實例。即在創建靜態類內部對象時,不需要其外部類的對象
3、靜態內部類示例
java在實現LinkedList時使用了如下內部類:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
........
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
........
}
這里即靜態內部類的典型用法