在一个类的内部定义的类称为内部类。内部类允许把一些逻辑相关的类组织在一起,并且控制内部类代码的可视性。对于初学者而言,内部类似乎有些多余,但是随着对内部类的逐步了解,就会发现它有独到的用途。学会使用内部类,是掌握Java高级变成的一部分,它能够让程序结构变得更优雅~
内部类的基本语法
顶层类只能处与public和默认级别,而成员内部类可以处与public,protected,默认和private这4种访问级别。
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
嵌套类有两种类型:
1.非静态内部类
2.静态内部类
1.非静态内部类
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。
由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
//在自己创建的普通类中粘贴下面的代码就可以
int x = 123; //属于外部类的,也就是自己创建的类
public class Inner{ //这一步,创建了内部类
int y = 321;
}
完整代码:
public class Outer {
int x = 123;
public class Inner {
int y = 321;
}
}
//先创建一个类叫Outer,在类里给x赋值
//再在Outer里输入public class Inner { },创建一个名字叫Inner的类
//这样,Outer这个类叫做Inner的外部类。Inner叫做Outer的内部类。
测试类:
public static void main(String[] args) {
Outer myOuter = new Outer(); //①
Outer.Inner myInner = myOuter.new Inner(); //②
System.out.println(myOuter.x + myInner.y); //③
}
运行结果:
444
私有的内部类
上面说到成员内部类可以处与public,protected,默认和private这4种访问级别。如果你不希望内部类被外部类访问可以使用 private 修饰符来修饰内部类。
比如我们把上面的内部类前面的public换成private,再执行代码就会报错。其实应该能发现,再改成private之后,测试类中跟Inner有关的会报错。
2.静态内部类
静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问到它。我们把private改回public,在public后面加上static。
public static class Inner {
测试类中我们注释掉②(在②这一行的最前面输入//),在②的下面重新输入:
Outer.Inner myInner = new Outer.Inner();
比较有无static关键字定义:
//Outer.Inner myInner = myOuter.new Inner(); //②
Outer.Inner myInner = new Outer.Inner();
对比两行代码,②是通过创建外部类来访问,另一个是直接访问。
运行结果和之前相同。
注意:静态内部类无法访问外部类的成员。
从内部类访问外部类成员
接着上面的“注意:”,内部类中输入:int z = x + y;
public static class Inner {
int y = 321;
int z = x + y; //输入这一行
}
会发现x下面有红线,访问不到外部类的x,当把static删除之后,就可以访问到了。
当把static删掉之后,测试类中会有报错,因为删掉static之后不是静态内部类了,我们需要创建外部类来访问,所以把②的注释删掉(删掉//),把②下面一行注释掉(加上//),就可以了。