Java中的三种内部类

来源:互联网 发布:java从入门到放弃系列 编辑:程序博客网 时间:2024/04/25 15:40

内部类

内部成员类:和成员方法并列,无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%正确性,如有不同见解请在下面留言即可,共同学习进步。   

原创粉丝点击