1. 程式人生 > >Java中的三種內部類

Java中的三種內部類

內部類

內部成員類:和成員方法並列,無static修飾 嵌入類:和成員方法並列,並且有static修飾 本地類:在成員方法中定義的類

例項如下:OuterClass是一個外部類,裡面定義了三個內部類InnerClass、NestedClass、MethodClass分別對應上面三種內部類,還定義了一個不相關的類AnotherClass和一個public修飾的主類DemoClass,該檔名稱為DemoClass.java。通過javac命令編譯後,產生的各類如圖所示,通過觀察可知即使將類寫在同一個java檔案中,編譯出的class檔案也是獨立命名的,只有內部類才會以$符號相連去命名。

哈哈哈

import cn.oracle.inner.OuterClass.InnerClass;
import cn.oracle.inner.OuterClass.NestedClass;

class OuterClass
{
    //內部成員類
    public class InnerClass
    {    
        public void InnerMethod()
        {
            System.out.println("innerMethod");
        }
    }
    //巢狀類
    public static class NestedClass
    {
        public void nestMethod()
        {
            System.out.println("nestMethod");
        }
        public static void snestMethod()
        {
            System.out.println("nestMethod");
        }
    }
    public void method()
    {
        class MethodClass
        {
            //本地類
            public void MethodMethod()
            {
                System.out.println("methodMethod");
            }
        }
        new MethodClass().MethodMethod();
    }
}
class AnotherClass
{
    public void anotherMethod()
    {
        System.out.println("anotherMethod");
    }
}
public class DemoClass
{
    //內部類物件宣告的兩種寫法 外部類名.內部類名 obj和內部類名 obj
    public static void main(String[] args)
    {
        OuterClass outerobj = new OuterClass();
        //內部成員類物件建立的方法
        OuterClass.InnerClass e_innerobj;
        InnerClass innerobj;
        e_innerobj = outerobj.new InnerClass();
        innerobj = outerobj.new InnerClass();
        
        //巢狀類物件建立的方法
        OuterClass.NestedClass e_nestedobj;
        NestedClass nestedobj;
        e_nestedobj = new NestedClass();
        nestedobj = new NestedClass();
        e_nestedobj = new OuterClass.NestedClass();
        nestedobj = new OuterClass.NestedClass();
    }
非靜態方法呼叫無疑是用物件去呼叫,所以只在下面說一下巢狀類中的靜態方法的呼叫 如下所示,四種呼叫snestedMethod方法的方式都是正確的。 A :NestedClass nestedobj = new OuterClass.NestedClass(); nestedobj.snestedMethod(); B  :OuterClass.NestedClass nestedobj = new OuterClass.NestedClass(); nestedobj.snestedMethod(); C :OuterClass.NestedClass.snestedMethod(); D :
NestedClass.snestedMethod(); 內部類的一點總結: *三種內部類中只有巢狀類中可以定義靜態方法 *本地類物件只能在其所定義的方法中建立 *內部成員類建立物件的方法:內部類物件 = 外部類物件.new 內部類() *巢狀類建立物件的方法:內部類物件 = new 內部類()  或者 內部類物件 = new 外部類名稱.內部類(); *巢狀類呼叫自己裡面的靜態方法有上述四種方式 *內部類匯入到別的類中使用的時候引入的類路徑寫法 如 import cn.oracle.inner.OuterClass.InnerClass;import cn.oracle.inner.OuterClass.NestedClass;
*通過反射不能獲取到本地類的class物件,通過反射的Class.forname()獲取內部類的class物件,類路徑應該寫為Class clazz = Class.forName("cn.oracle.inner.OuterClass$InnerClass"); 以上總結均為博主自己試驗所得結果無法保證100%正確性,如有不同見解請在下面留言即可,共同學習進步。