嵌套类
- 定义
嵌套类(Nested class)是指定义在另一个类的内部类。 - 作用
用于为他的外围类提供服务。 - 分类
嵌套类可以分为四种,静态成员类static number class
、非静态成员类nostatic number class
、匿名类anonymous class
、局部类local class
。
静态类
静态类是最常用的内部类,可以看成普通类,只是凑巧在另外一个声明类里
- 静态类可以访问外围类的所有变量和方法,包括私有成员。同样,如果静态类声明为私有类,也只能被本外围类访问。
- 作用
常见共有类的辅助类,仅当与他的外部类一同使用,才能起作用(非静态类,只有与外围实例,才起作用)。例如,Calcuator.Operation.PULS
、Calcuator.Operation.MINUS
。 - 作用方式
可以独立与外围类,不需要外围类提供实例。同样,在没有外围实例情况下,也无法创建非静态类。
- 作用
非静态类
- 注意
之所以优先考虑静态类,是因为非静态类,每一个实例都会包含一个额外的指向外围对象的引用,消耗时间和空间,同时导致外围实例在可以回收时被保留。
匿名类
1.注意
- 匿名类并不在其他成员一同声明,仅在被使用时候,声明和实例化。
- 仅当匿名类同时出现在非静态环境时,才有外围实例。
2. 用法
- 动态地创建函数对象
总结
如果一个嵌套类需要在单个方法外仍然可见(可以单独使用方法),或者太长,应该考虑使用成员类。
- 如果成员类的每个实例都需要一个指向其外围实例的引用,使用非静态,否则设为静态类。
- 如果嵌套属于方法内部,或者只需要在一个地方使用实例,构造匿名类,否则局部类。
- Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
静态/非静态类的调用格式
public class Enclosingone {
//非静态内部类
public class InsideOne {}
//静态内部类
public static class InsideTwo{}
}
class Mytest02{
public static void main(String args []){
Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非静态内部类对象
Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//静态内部类对象
}
}
来源: https://www.nowcoder.com/test/question/done?tid=7018078&qid=7673#summary