内部类

来源:互联网 发布:淘宝装修工具2.1 编辑:程序博客网 时间:2024/06/12 01:02

定义在其他类内部的类就被称为内部类,包含内部类的类也被成为外部类。
作用:
1、内部类提供了更好的封装。
2、内部类成员可以直接访问外部类的私有数据,因为内部类被当成外部类成员,同一个类的成员之间可以相互访问。但外部类不能访问内部类的实现细节,比如内部类的成员变量。
3、匿名内部类适合用于创建那些仅需一次使用的类。
静态内部类与外部类的区别:
1、内部类比外部类可以多使用3个修饰符:private、protected、static。外部类:public、abstract、final
2、非静态内部类不能拥有静态成员。(静态方法、静态成员变量、静态初始化块)

成员内部类是一种与成员变量、方法、构造器和初始化块相似的类成员;局部内部类和匿名内部类则不是类成员。
非静态内部类的成员可以访问外部类的private成员,但反过来就不成立了。

静态内部类:只要把外部类当成静态内部类的包空间即可。
使用static修饰的内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。
静态内部类可以包含静态成员,也可以包括非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员,即使静态内部类里的实例方法也不能访问外部类的实例变量,只能访问外部类的类成员。
外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。
接口里也允许定义内部类,默认是public static修饰。

1、在外部类以外的地方使用内部类(静态和非静态)变量:
OuterClass.InnerClass varName;
2、在外部类以外的地方创建非静态内部类实例的语法:
OuterInstance.new InnerConstructor()
非静态内部类的构造器必须通过其外部类对象来调用。Out.in in = new Out().new In();
3、在外部类以外的地方创建静态内部类实例:
new OuterClass.InnerConstructor()
区别:静态内部类只需使用外部类即可调用构造器,而非静态内部类必须使用外部类对象来调用构造器。

局部内部类
把一个内部类放在方法里定义,局部内部类仅在该方法里有效。
由于局部内部类不能在外部类的方法以外的地方使用,因此局部内部类也不能使用访问控制符和static修饰。(上一级都是方法,而不是类,使用static修饰没有意义)

匿名内部类
适合那种只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。格式:
new 实现接口()| 父类构造器(实参列表)
{
//匿名内部类的类体部分
}
匿名内部类必须继承一个父类或者实现一个接口,但最多只能继承以后父类或实现一个接口。
两条规则:
匿名内部类不能是抽象类。
匿名内部类不能定义构造器。
创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。
java8: 局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰符。

原创粉丝点击