将一个类的定义放在另一个类的定义内部,这就是内部类
当你生成一个内部类对象时,该对象必定会保存一个制造他的外围类对象的引用,所以内部类对象可以访问其外围类对象的所有成员,此外内部类拥有外围类所有元素的访问权(包括声明为private的),内部类作为外围类的一个成员,外围类对象也可以访问内部类的所有元素.
在除了外部类的非静态方法之外的任何地方创建某个内部类的对象,必须用:OutClassName.InnerClassName具体的指明这个对象的类型
如果要直接创建一个内部类的对象,必须使用外部类的一个对象和". new"来创建内部类的一个对象
例如:Parcel3.Contents c = p.new Contents();
因此,除非你已经有了一个外围类的对象,否则不可能生成内部类的对象(除非是嵌套类(static inner class)),因为内部类对象需要保存创建它的外围类对象的引用.
使用OutClassName.this可以返回制造这个内部类的那个外围类的引用.
内部类可以声明在方法中,或者是方法中的某个作用域中,,但是出了这个方法或作用域,改类不能再被使用(不能使用其声明或创建对象)
内部类(Inner class) VS 嵌套类(Nested class)
将内部类声明为static通常称为嵌套类,内部类对象隐含地保存了一个引用指向创建它的外围类对象.而要创建嵌套类不需要外围类对象,不能从嵌套类对象中访问非静态的外围类对象.
普通内部类中不能有static的属性和方法,也不能包含嵌套类,而嵌套类可以包含所有的这些东西.
嵌套类可以作为接口的一部分,因为他是static的,只是将嵌套类放在接口的命名空间内.
为什么使用内部类:
非内部类不能声明为protect或private,将内部类声明为private或protect意味着客户端想要访问这些成员将受到严格的限制,对于声明为private的,只有其外围类可以访问,而声明为protect的,只有在一个包中或者从该内部类继承的类才可以访问.但这种隐藏机制并不是使用内部类的目的,毕竟将一个类声明为"包访问"便可以实现很好的代码隐藏.
但如果内部类实现了某个接口或者是从某个基类继承而来,则内部类就有了用武之地.因为这个内部类作为某个接口的实现或某个基类的继承对于其它人来说完全不可见,并且不可用,你所得到的只是一个指向基类或接口类型的一个引用.因为它们是private或protect的,所以你甚至不能将这个引用向下转型(除非你有继承protect内部类的子类),因为它们对你不可见.所以private内部类使用类的设计者可以阻止任何依赖于这些内部类的具体类型的编码,并且完全隐藏了细节,使接口与实现完全分离.此外,从客户端程序员的角度来说,由于不能访问任何原本不属于公共接口的方法,所以扩展接口是没有价值的.
内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外围类的对象,所以你可以认为内部类提供了一个某种进入其外围类的接口.典型的应用就是迭代子模式.
很多情况下你需要在接口的实现上工作,而每个内部类都能独立地实现一个继承一个接口的实现,无论外围类有没有实现接口,对内部类都没有影响.这样,使用内部类允许你的一个类继承多个非接口类型
如果上面例子中要继承的是抽象或具体的类,则只能使用内部类来实现多重继承.
闭包与回调
闭包:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.
可以看出,内部类是面向对象的闭包,因为他不仅包含外围类对象的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所用的成员包括private成员.
在这里回调指的是内部类调用外部类的属性和方法,即使用回调可以使一些对象携带一些信息以允许它在稍后的某个时刻调用初始的对象.
回调函数:实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。
回调机制:
1.系统承诺发生什么事件时会执行什么接口的什么方法.
2.由对事件有兴趣的对象预先实现一个符合接口的具体行为.注册到事件管理系统中,这样系统就有了一个指向这个接口的引用.
3.系统运行时由事件管理系统在事件发生时执行预定义的实现.
当你生成一个内部类对象时,该对象必定会保存一个制造他的外围类对象的引用,所以内部类对象可以访问其外围类对象的所有成员,此外内部类拥有外围类所有元素的访问权(包括声明为private的),内部类作为外围类的一个成员,外围类对象也可以访问内部类的所有元素.
在除了外部类的非静态方法之外的任何地方创建某个内部类的对象,必须用:OutClassName.InnerClassName具体的指明这个对象的类型
如果要直接创建一个内部类的对象,必须使用外部类的一个对象和". new"来创建内部类的一个对象
例如:Parcel3.Contents c = p.new Contents();
因此,除非你已经有了一个外围类的对象,否则不可能生成内部类的对象(除非是嵌套类(static inner class)),因为内部类对象需要保存创建它的外围类对象的引用.
使用OutClassName.this可以返回制造这个内部类的那个外围类的引用.
内部类可以声明在方法中,或者是方法中的某个作用域中,,但是出了这个方法或作用域,改类不能再被使用(不能使用其声明或创建对象)
内部类(Inner class) VS 嵌套类(Nested class)
将内部类声明为static通常称为嵌套类,内部类对象隐含地保存了一个引用指向创建它的外围类对象.而要创建嵌套类不需要外围类对象,不能从嵌套类对象中访问非静态的外围类对象.
普通内部类中不能有static的属性和方法,也不能包含嵌套类,而嵌套类可以包含所有的这些东西.
嵌套类可以作为接口的一部分,因为他是static的,只是将嵌套类放在接口的命名空间内.
为什么使用内部类:
非内部类不能声明为protect或private,将内部类声明为private或protect意味着客户端想要访问这些成员将受到严格的限制,对于声明为private的,只有其外围类可以访问,而声明为protect的,只有在一个包中或者从该内部类继承的类才可以访问.但这种隐藏机制并不是使用内部类的目的,毕竟将一个类声明为"包访问"便可以实现很好的代码隐藏.
但如果内部类实现了某个接口或者是从某个基类继承而来,则内部类就有了用武之地.因为这个内部类作为某个接口的实现或某个基类的继承对于其它人来说完全不可见,并且不可用,你所得到的只是一个指向基类或接口类型的一个引用.因为它们是private或protect的,所以你甚至不能将这个引用向下转型(除非你有继承protect内部类的子类),因为它们对你不可见.所以private内部类使用类的设计者可以阻止任何依赖于这些内部类的具体类型的编码,并且完全隐藏了细节,使接口与实现完全分离.此外,从客户端程序员的角度来说,由于不能访问任何原本不属于公共接口的方法,所以扩展接口是没有价值的.
内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外围类的对象,所以你可以认为内部类提供了一个某种进入其外围类的接口.典型的应用就是迭代子模式.
很多情况下你需要在接口的实现上工作,而每个内部类都能独立地实现一个继承一个接口的实现,无论外围类有没有实现接口,对内部类都没有影响.这样,使用内部类允许你的一个类继承多个非接口类型
interface A {} interface B {} class X implements A, B {} class Y implements A { B makeB() { // Anonymous inner class: return new B() {}; } } public class MultiInterfaces { static void takesA(A a) {} static void takesB(B b) {} public static void main(String[] args) { X x = new X(); Y y = new Y(); takesA(x); takesA(y); takesB(x); takesB(y.makeB()); } }
如果上面例子中要继承的是抽象或具体的类,则只能使用内部类来实现多重继承.
闭包与回调
闭包:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.
可以看出,内部类是面向对象的闭包,因为他不仅包含外围类对象的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所用的成员包括private成员.
在这里回调指的是内部类调用外部类的属性和方法,即使用回调可以使一些对象携带一些信息以允许它在稍后的某个时刻调用初始的对象.
回调函数:实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。
回调机制:
1.系统承诺发生什么事件时会执行什么接口的什么方法.
2.由对事件有兴趣的对象预先实现一个符合接口的具体行为.注册到事件管理系统中,这样系统就有了一个指向这个接口的引用.
3.系统运行时由事件管理系统在事件发生时执行预定义的实现.
发表评论
-
UseCase驱动的过程
2008-10-26 15:26 0本章讨论理解问题和建立问题模型的方法,RUP推荐的方法就是Us ... -
以架构为中心的过程
2008-10-23 09:40 0模型的重要性 RUP有很大 ... -
动态结构:迭代开发
2008-10-22 09:15 0为什么要迭代: 两个常阻碍软件项目成功的错误假设: 错误假设 ... -
RUP导论:动态结构:迭代开发
2008-10-04 20:46 0本章描述RUP的生命周期结构,即整个开发过程是如何进行的. 迭 ... -
RUP导论:最佳软件开发实践
2008-10-03 22:51 0本章讨论最佳软件开发实践,并对RUP做了大体介绍. 软件 ... -
Array
2008-09-28 00:37 0数字与容器类的不同之处: 效率,类型,和装载原生数据类型的能力 ... -
Thinking in Java 笔记:Reflection
2008-09-21 21:11 1128反射的概念是由Smith在1982年首次提出的,主要是指程 ... -
Thinking in Java 笔记:RTTI
2008-09-21 21:09 1822RTTI即run-time type identifica ... -
Generics
2008-09-21 21:05 0泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
String
2008-09-12 10:55 0String 类被声明为final 所以它不能被继承 一个St ... -
Thinking in Java 笔记: Initialication & Cleanup
2008-09-05 14:42 1072成员变量和局部变量初始化: 成员变量若不显式初始化j ... -
Thinking in Java 笔记:Operators
2008-09-05 14:42 1418数学没学好,补充点数学 ... -
Thinking in Java 笔记:Everything is an Object
2008-09-05 14:41 1477无聊了,当当买了本原版的 Thinking in java 4 ...
相关推荐
Thinking in C: Foundations for Java & C++ by Chuck Allison produced by Bruce Eckel Chapter 1: Introduction and Getting Started40 MinutesStart Lecture Chapter 2: Fundamental Data Types41 ...
### Thinking in Java 读书笔记知识点总结 #### 一、万事万物皆对象 1. **对象存储位置** - **寄存器**:程序无法直接控制。 - **栈(Stack)**:存储基本类型数据和对象引用,但对象本身不在此处。 - **堆(Heap)...
### Thinking in Java 自学笔记——第二章 一切皆对象 #### 重要概念解析 ##### 2.1 用引用操纵对象 在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当...
根据提供的文件信息,以下是对文件《Thinking in Java 4th Edition Annotated Solutions Guide》中所包含知识点的详细解释: 首先,文件标题《Thinking in Java 4th Edition Annotated Solutions Guide》指出了这是...
《Thinking in Java》第四版由布鲁斯·埃克尔(Bruce Eckel)撰写,他是MindView公司的总裁。这本书被广泛认为是学习Java编程语言的经典教材之一。从读者的反馈来看,《Thinking in Java》不仅覆盖了Java的核心概念...
《Thinking in Java》是Bruce Eckel的经典之作,第五版(The Class object)主要探讨的是类对象(Class object)这一核心概念。在Java编程语言中,类对象是与类相关的特殊对象,它提供了对类信息的访问,包括类的元...
读书笔记:Thinking in Java (Java 编程思想)
《Thinking in Java》是一本深度解析Java编程语言的经典著作,其深入浅出的讲解和丰富的实例使得读者能够全面理解Java的精髓。以下是对书中部分关键知识点的总结: 1. **Java 泛型**:泛型是Java SE 5.0引入的重要...
研讨课 Hands-on Java研讨课CD Thinking in Objects研讨课 Thinking in Enterprise Java Thinking in Patterns(with Java) Thinking in Patterns研讨课 设计咨询与复审 附录B 资源 软件 编辑器与IDE 书籍 分析与设计...
《Thinking in Java》是Bruce Eckel的经典之作,第四版涵盖了Java编程语言的广泛主题,适合初学者和有经验的程序员。这本书深入浅出地讲解了Java的核心概念和技术,旨在帮助读者建立坚实的编程基础,并理解面向对象...
Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...
《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java语言的核心概念和技术。这本书的练习题是学习Java的重要组成部分,因为它们能够帮助读者巩固理论知识并提升实践能力。以下是对"Thinking in ...
《Thinking in Java》是Bruce Eckel的经典之作,第四版(TIJ4)更是Java程序员必读的书籍之一。这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、集合框架、多线程、网络编程等众多主题。源码是...
《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...
Thinking In Java-Java 编程思想(中英文版 第四版) Thinking In Java-Java 编程思想(中英文版 第四版)
《Thinking in Java》是Bruce Eckel的经典之作,被誉为学习Java编程的权威指南。该书以其深入浅出的方式,详尽地介绍了Java语言的核心概念和技术。第三版是此书的一个重要里程碑,它涵盖了Java语言的诸多关键特性,...
《Thinking in Java》是Bruce Eckel的经典编程教材,它深入浅出地介绍了Java语言的核心概念和技术。这本书以其详尽的解释、丰富的示例和实践性强的习题深受程序员喜爱。"Thinking in Java 习题答案"是配套的解答集,...
《Thinking in Java》是一本备受推崇的Java编程教材,由Bruce Eckel撰写,被誉为Java学习者的必读之作。这本书深入浅出地介绍了Java语言的核心概念和技术,覆盖了从基础到高级的主题,对于有一定Java基础的读者来说...
《Thinking in Java》是Bruce Eckel的经典之作,第四版更是被广大Java开发者视为学习和进阶的重要参考书籍。这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、集合框架、多线程、网络编程、GUI...
在众多关于Java的学习材料中,《Thinking in Java》第二版以其独特的视角和方法论成为了一本备受推崇的教科书。 本书由Bruce Eckel所著,作为一本权威性的Java编程教程,它不仅仅是向读者介绍Java语言的语法和基础...