内部类
概述
内部类是定义在另一个类中的类。
为什么使用内部类
- 内部类方法可以访问该类定义所在的作用域的数据,包括私有的数据。
- 内部类可以对同一个包中的其它类隐藏起来。
- 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
公有/私有内部类
- 内部类可以访问创建它的外围类对象的数据域
- 内部类可以声明为私有的
- 内部类中声明的所有静态域都必须是final
- 非静态内部类中不可以有静态变量和静态方法。(因为静态方法只能访问外围类的静态域和方法,得不偿失)
- OuterClass.this用来屏蔽内部类和外部相同的变量名
语法
public Class Main
{
// methods and data
public Class InnerClass
{
// methods and data
}
private Class InnerClassPrivate
{
// methods and data
}
}
局部内部类
当一个内部类只在一个方法中创建对象,可以在这个方法中定义局部类代替。
- 局部类不能有public和private访问说明进行声明,它的作用域被限定在声明这个局部类的块中。
- 除了该方法外,没有任何方法知道该类的存在。
- 可以使用该方法的局部变量。
语法
public Class Main
{
// methods and data
public void Start()
{
Class InnerClass
{
// methods and data
}
InnerClass innerClass = new InnerClass();
}
}
匿名内部类
将局部类的使用再深入一步,假设只创建该类的一个对象,就不必命名了。这种类被称为匿名内部类。
- 匿名类没有构造器,构造参数可以传递给超类的构造器
- 事件监听和回调最好还是用lamda表达式
语法
public Class Main
{
// methods and data
public void Start()
{
// 继承超类
SuperClass superClass = new SuperType(construction parameters)
{
inner class methods and data
};
// 实现接口
InterfaceClass interfaceClass = new InterfaceType()
{
methods and data
};
}
}
静态内部类
如果只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象,那么可以将内部类声明为static。
- 可以有静态域和方法
语法
public Class Main
{
// methods and data
public staic Class InnerStaticClass
{
// methods and data
}
private static Class InnerStaticClassPrivate
{
// methods and data
}
}

浙公网安备 33010602011771号