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