介绍内部类(Inner Class )和静态内部类)的区别。
在某个类内部定义的类称为内部类,包含内部类的类称为外部类。 内部类声明访问限制(如public、protected和private )、声明abstract对其他内部类和外部类的继承和扩展、声明static和final,以及实现特定接口外部类以常规的类访问方法使用内部类。 唯一的区别是外部类可以访问内部类的所有方法和属性,包括专用方法和属性。
(1)创建实例
out class.inner class obj=outclassinstance.new inner class (//注意是外部类实例. new,内部类
AAA.staticinnerin=newaaa.static inner (; //注意是外部类本身,静态内部类
)2)内部类this
内部类的this和其他类一样指的是本身。 创建内部类对象时,它与创建它的外围对象有某种联系,因此可以理解为内部类链接到外部类,而无需特殊条件。 使用外部类创建内部类对象时,该内部类对象将秘密捕获对外部类的引用,并允许通过该引用访问外围类的成员。
)3)外部类访问内部类
由于内部类类似于外部类的属性,因此必须始终创建外部类对象才能访问内部类对象。 内部类对象以"外部类名. this.xxx "的形式访问外部类的属性和方法。 例如:
system.out.println (printininnerouter.index=' pouter.this.index );
system.out.println (printininnerinner.index=' this.index );
)4)内部班级向上转换
内部类也可以和普通类一样具有上转换的特性。 将内部类升级为基本类型,特别是在接口上,内部类有用途。 如果内部类为private,则只能询问该外部类,并且可以完全隐藏实现详细信息。
)5)方法中的类
在方法中创建的类(注意,该方法也可以定义类)不能具有访问修饰符。 此外,方法内部的类也不是在调用方法时创建的,同样是预编译的。
)6)静态内部类
定义静态内部类:定义内部类时,可以在前面添加权限修饰符static。 此内部类将是静态内部类。
通常称为嵌套类,如果内部类是静态类,则意味着
[1]要为嵌套类创建对象,不需要外围类中的对象。
[2]无法从嵌套类的对象访问非静态外围类对象(无法从静态内部类的对象访问外部类的非静态成员);
嵌套类和常规内部类还有另一个区别。 常规内部类的字段和方法只能位于类的外部层次结构中,因此常规内部类不能有静态数据和静态字段,也不能包含嵌套类。 但是,嵌套类可以包含所有这些。 这意味着不能在非静态内部类中声明静态成员。 只有在将一个内部类限定为静态类时,才能定义静态成员变量和成员方法。
此外,在创建静态内部类时,不需要将静态内部类的实例绑定到外部类的实例。 普通非静态内部类的对象依赖于外部类对象,不需要使用关键字new创建内部类的实例即可在外部类中定义静态内部类。 静态类和方法属于类本身,而不是该类的对象,也不是其他外部类的对象。
(7)内部类标识符
将为每个类生成. class文件。 文件名是类名。 同样,内部类也会生成这样的. class文件,但其名称有严格的限制,即外围类的名称必须为$,而不是内部类的类名。
)8)为什么要使用内部类?
1 .内部类一般只用于其外部类;
2 .内部类为进入外部类提供了窗口
3 .这也是最吸引人的理由。 无论外部类是否继承已经存在的接口,每个内部类都可以独立地继承一个接口。 因此,内部类使多重继承的解决方案更完整。
请加深印象,作为参考:
packagecom.test.xml;
publicclassOutClassTest{
静态Inta;
intb;
publicstaticvoidtest (
system.out.println (outerclassstaticfunction );
}
publicstaticvoidmain (字符串[ ] args ) {
OutClassTestoc=newOutClassTest (;
//new外部类
outclasstestoc1=newoutclasstest (;
//在外部类的对象上新建非静态内部类
outclasstest.inner classno _ static _ inner=oc1.new inner class (;
//调用非静态内部类的方法
system.out.println (no _ static _ inner.getkey ();
//调用静态内部类的静态变量
system.out.println (outclasstest.innerstaticclass.static _ value;
//直接实例化内部静态类,而不依赖于外部类实例
outclasstest.innerstaticclassinner=newoutclasstest.innerstaticclass (;
//调用静态内部类的非静态方法
system.out.println (inner.getvalue ();
//调用内部静态类的静态方法
system.out.println (outclasstest.innerstaticclass.getmessage () );
}
私有群集
//只有静态内部类可以声明或定义静态成员
//私有静态字符串TT='0';
私有int flag=0;
公共inner类(
//3 .非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量
system.out.println (innerclasscreatea : ) a;
system.out.println (innerclasscreateb : ) b;
system.out.println (innerclasscreateflag : ) flag );
//
system.out.println (innerclasscallouterstaticfunction );