其实这一条的题目应该再多几个字“在四中嵌套类中,优先考虑静态成员类”,这样才更不容易产生歧义。
所谓嵌套类(nested class)是指定义在另一个类内部的类。嵌套类存在的目的应该只是为了它的外围类提供服务。共分为四种:
1)静态成员类(static member class)
2)非静态成员类(nonstatic member class)
3)匿名类(anonymous class)
4)局部类(local class)
其中后三者又被统称为内部类(inner class)
本条就是说在以上这四中,应该优先使用静态成员类。它是一种最简单的嵌套类。最好把它看成是一个普通的类,只是恰好被声明在了另一个类的内部而已,它可以访问外围类的所有成员(包括private)。
静态成员类的一种通常用法是作为公有的辅助类,仅当与它的外部类一起使用时才有意义。
如:一类汽车,它们有各种不同的档位,那么描述这些档位的枚举常量,应该是 MotorCar.TapPosition.TAP_ONE 和 MotorCar.TapPosition.TAP_TWO 等等的。 这里的TapPosition就是MotorCar的静态成员类。脱离开MotorCar,你是无法直接使用TapPosition的(也没有意义)。
非静态成员类从语法的角度仅与静态成员类有一子之差——修饰符中不含static。尽管它们的语法非常相似,但用处有很大不同。非静态成员类得每一个实例都隐含着与外围类的一个外围实例紧密关联在一起,在其内部调用外围类的方法是可能的,也可以使用this引用。(更多关于非静态成员类使用方法的介绍,可以搜索Adaper 适配器,或参考Map、Set、List的各种实现类)
换言之,一个嵌套类是否可以在它的外围类的实例之外独立存在,是决定使用静态成员类还是非静态成员类的一个重要依据。
匿名类不同于Java语言中的任何其他语法单元,它是没有名字的。它不是外围类的一个成员。它并不与其他成员一起被声明,而是在被使用的点上,同时被声明和实例化。因此匿名类只能被用在代码中它将被实例化的那个点上。还有,因为它没有名字,所以在它被实例化后就不能再对它进行引用。
匿名类出现在表达式中间,所以它们应该非常简短,太长的话影响可读性。匿名类的通常用法是:
1)创建一个函数对象
Arrays.sort(args, new Compartor() {
public int compare(Object o1, Object o2) {
return ((String)o1).length() - ((String)o2).length();
}
});
2)创建一个过程对象
最后说局部类,局部类是四种嵌套类中最少使用的类。在任何“可以声明局部变量”的地方,都可以声明局部类,它也遵循着同样的作用域规则。局部类与其他三种嵌套类的每一种都有一些共性。
总之,四种嵌套类,各有各的用处。如果一个嵌套类需要在一个以上的地方使用,或者它太长了,不适合放在一个方法(注意:不是类)内部,那么应该使用成员类。如果成员类的每个实例都需要一个指向外围实例的应用(需要使用this),则他成员类做成非静态的;否则就应该做成静态的。
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208
分享到:
相关推荐
当类中同时存在静态和非静态同名成员时,静态成员优先。 #### 11. 静态成员与非静态成员的关系 静态成员与非静态成员之间存在着明显的区别: - **内存分配**:静态成员在类加载时只分配一次内存空间;而非静态...
3. 优先考虑使用静态成员类。 4. 使用final、static和private修饰符来防止意外的类初始化。 5. 尽量避免使用原始类型数组,而是使用泛型集合。 6. 使用泛型编写类、方法和接口。 7. 避免在public API中使用可变对象...
本资源摘要信息涵盖了 Java 基础入门第三版第三~第四章作业的知识点,包括Java 中的继承、面向对象的特征、访问控制、接口、静态代码块、构造代码块和构造方法、Object 类等。 一、继承 * 在 Java 中,类只支持单...
### Java 判断题知识点解析 #### 第一章 Java 概述 1. **Java 语言具有良好的安全性与可移植性及平台无关...创建对象时,系统为其分配内存,该内存包含了对象的所有非静态成员变量以及一些额外的信息(如对象头等)。
17. **考虑使用静态成员**:静态成员属于类而非对象,适用于类级别的数据和函数,不涉及对象实例。 18. **理解虚函数和多态**:虚函数是实现动态多态的基础,使得基类指针可以调用派生类的重写函数。 19. **避免...
- 选项A描述错误,静态成员在创建第一个对象之前就已经存在。 - 其他选项正确描述了静态成员的特点。 #### 九、友元 - **知识点**: - 友元关系允许一个类访问另一个类的私有和保护成员。 - 友元可以是函数或类...
* 静态方法只能访问静态成员(方法和变量) * 非静态方法既可以访问静态也可以访问非静态 * 静态方法中不可以出现 this,super 关键字 何时使用静态? 何时定义静态变量(类变量)当对象中出现共享数据时,该数据被...
18. **构造器调用顺序**:在子类构造器中,`super()`调用必须是第一条语句。 19. **`final`关键字**:`final`可以修饰形参,防止在方法内部修改参数值。 20. **`import`语句**:`import`语句用于引入所需的类或包...
- 优先使用接口而非抽象类进行面向接口的编程。 - 接口提供了更好的灵活性和扩展性,使得代码更加松耦合。 - 当需要具体实现时,可以考虑使用抽象类来提供部分默认实现。 #### 14. 代码的可维护性 - 保持代码结构...
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会...8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名...
谭浩强教授,我国著名计算机教育专家。1934年生。1958年清华大学毕业。学生时代曾担任清华大学学生会...8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 通过对象名...
System是预定义的类,out是该类的静态成员变量,类型为PrintStream,println是PrintStream类的方法,用于输出一行文本。 3. **Java中的大小写敏感**: Java语言严格区分大小写,包括变量名、类名、方法名等都需...
- **静态成员变量**:类的静态成员变量不为任何特定对象所有,而是被所有对象共享。 - **用途**:用于实现跨对象的数据共享。 #### 24. 友元关系的特点 - **单向性**:A类是B类的友元,但B类不一定是A类的友元。 - ...
8. `this`指针在每个非静态成员函数中隐含存在,指向调用该函数的对象,所以B选项正确。第九题,`this`指针不是指向虚函数表的,也不是指向成员的,而是指向对象自身的,所以A和D选项错误。C++中,函数可以在调用后...
在C++中,`this`指针是在非静态成员函数中隐含存在的,指向调用该函数的对象,选项B正确。 第十二题,函数在被调用前需要先声明,选项C正确。函数可以不带参数,也可以不返回值,甚至可以递归调用自己。 运算符...
3.3.3实例成员变量和静态成员变量114 3.4方法的定义和实现116 3.4.1方法的声明117 3.4.2创建方法体与return语句117 3.4.3局部变量和成员变量的区别119 3.4.4方法的访问权限121 3.5方法的调用121 3.5.1方法...
- **注意事项**: 内部类对包含类的访问不受限,但如果包含类是静态的,则内部类不能访问外部类的非静态成员。 **28. Anonymous Inner Class(匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)...
11.4.7 静态成员变量 326 11.4.8 局部变量的修饰符 326 11.4.9 当final遇到引用类型成员变量 327 11.5 小结:修饰符作用大 328 11.6 习题 330 第12章 接口 331 教学视频:29分钟 12.1 自行车带来的问题 331 ...