大部分时候,类被定义在一个独立的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修饰的内部类被称为类内部类,有的地方也称为静态内部类。
静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员访问规则,静态内部类的方法或代码块不能访问外部类的实例成员,只能访问外部类的静态成员。
//TODO
class 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(){};
}