大部分时候,类被定义在一个独立的class中。在某些情况下,也会把一个类放在另一个类中的内部定义,这个定义在其他类内部的类被称为内部类。包含内部类的类也被称为外部类。
1、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
2、内部类成员可以直接访问外部类私有数据,但外部类不能访问内部类的实现细节。
3、匿名内部类仅适用于需要使用一次的类。
4、内部类比外部类可以多3个修饰符:PRivate、protected、static
5、非静态内部类不能拥有静态成员
定义格式
public class OuterClass{ class innerClassA{} public class innerClassB{} }从上面代码可以看出,内部类在外部类成员位置,所以说内部类也可以访问外部类的成员。
//TODO 内部类定义并在外部类使用,静态方法不能new内部类
class OuterClass{ class InnerClass { } public static void main(String[] args){ InnerClass innerClass = new InnerClass(); }}静态内部类
使用static修饰的一个内部类,则这个内部类属于所在外部类本身,而不属于外部类创建出来的某个对象,因此使用static修饰的内部类被称为类内部类,有的地方也称为静态内部类。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员访问规则,静态内部类的方法或代码块不能访问外部类的实例成员,只能访问外部类的静态成员。
//TODOclass OuterClass{ static String school; static class InnerClass { static{ school= "abcd"; } String name; String age; static String address; } public static void main(String[] args){ InnerClass innerClass = new InnerClass(); }}具有内部类的类被编译后,编译文件格式如下:
使用内部类
定义格式:
外部类.内部类变量名= new外部类().new 内部类();
class OuterClass{ class InnerClass { String name; public void printName(){ System.out.println(name); } } }class TestInnerClass{ public static void main(String[] args){ OuterClass.InnerClassinnerClass = new OuterClass().new InnerClass(); innerClass.name= "abcd"; innerClass.printName(); }}使用静态内部类
外部类.内部类 变量名=new 外部类.内部类();
class OuterClass{ static class InnerClass { String name; public void printName(){ System.out.println(name); } } }class TestInnerClass{ public staticvoid main(String[] args){ OuterClass.InnerClassinnerClass = newOuterClass.InnerClass(); innerClass.name= "abcd"; innerClass.printName(); }}局部内部类
class OuterClass{ public void method(){ class InnerClass { Stringname = "abcd"; } InnerClass in = new InnerClass(); System.out.println(in.name); } }class TestInnerClass{ public static void main(String[] args){ OuterClass out = new OuterClass(); out.method(); }}匿名内部类
匿名内部类没有类名,适用于:仅使用一次的时候。New 该类的父类或接口代表该匿名内部类。
class OuterClass{ public void method(){ new InnerClass(){ public void method(){ System.out.println("这是一个匿名内部类"); } }.method(); } }class InnerClass{ void method(){};}
新闻热点
疑难解答