天天看點

Java充電站:Java内部類面試題彙總

1、靜态内部類與非靜态内部類有什麼差別?

  • 靜态内部類可以有靜态成員(方法,屬性),而非靜态内部類則不能有靜态成員(方法,屬性)。
  • 靜态内部類隻能夠通路外部類的靜态成員和靜态方法,而非靜态内部類則可以通路外部類的所有成員(方法,屬性)。
  • 執行個體化靜态内部類與非靜态内部類的方式不同
  • 調用内部靜态類的方法或靜态變量,可以通過類名直接調用

2、靜态内部類如何定義?

定義在類内部的靜态類,就是靜态内部類。
public class Out{
    public static int a;
    private int b;
    
    public static class Inner{
        public void print(){
            System.out.println(a);
        }
    }
}      
  1. 靜态内部類可以通路外部類所有的靜态變量和方法,即使是 private 的也一樣。
  2. 靜态内部類和一般類一緻,可以定義靜态變量、方法,構造方法等。
  3. 其它類使用靜态内部類需要使用“外部類.靜态内部類”方式,如下所示:Out.Inner inner = new Out.Inner();inner.print();
  4. Java集合類HashMap内部就有一個靜态内部類Entry。Entry是HashMap存放元素的抽象,HashMap 内部維護 Entry 數組用了存放元

    素,但是 Entry 對使用者是透明的。像這種和外部類關系密切的,且不依賴外部類執行個體的,都可以使用靜态内部類。

3、什麼是成員内部類?

定義在類内部的非靜态類,就是成員内部類。成員内部類不能定義靜态方法和變量(final修飾的除外)。這是因為成員内部類是非靜态的,類初始化的時候先初始化靜态成員,如果允許成員内部類定義靜态變量,那麼成員内部類的靜态變量初始化順序是有歧義的。
public class Out{
    public static int a;
    private int b;
    
    public class Inner{
        public void print(){
            System.out.println(a);
        }
    }
}      

4、Anonymous Inner Class(匿名内部類)是否可以繼承其它類?是否可以實作接口?

可以繼承其他類或實作其他接口,在 Swing 程式設計和 Android 開發中常用此方式來實作事件監聽和回調。

5、内部類可以引用它的包含類(外部類)的成員嗎?有沒有什麼限制?

一個内部類對象可以通路建立它的外部類對象的成員,包括私有成員。

6、是否可以從一個靜态(static)方法内部發出對非靜态(non-static)方法的調用?