还是举个例子吧。 设想一下你设计一个类,不妨叫A,它表示一个图形界面元素,通常,这样一个类除了拥有一般类的属性、方法之外,还应该能够“响应一些事件”,而这个特性并非一般的属性或者方法所能直接表现或者直接实现出来的。 在Java中,“一切都是对象”,而对象就是类的实例。所以Java图形界面库的设计者把一个图形界面元素所能响应的某一事件也定义成一个类。 假如你也这样设计,为类A的某个事件响应定义了类B,现在面临的问题是:类B是类A的事件(或者对象b代表了对象a所能响应的一个事件),而不是一个跟类A没有任何关系的类。那么类B为了在其事件响应过程中处理类A中的一些数据(响应事件的目的通常也就是这个),那么类B必然会产生这样的需要:它最好能直接访问类A的数据成员。 而Java中没有C++的友元机制,试问针对这种需要,还有比内隐类更合适的方法么?如果你用一下Java Swing,你就会发现:没有内隐类,就没有整个Swing库。所以,至少是到目前为止,内隐类是Java语言实现事件驱动程序设计的最重要的机制。还有,Java并不像C++那样支持多继承,于是不能直接同时拥有两个类的性质,也不能直接同时实现两个接口,这时候,使用组合的方式固然也能够解决问题,但许多时候,或许让一个类本身继承一个类,然后让这个类的内隐类再继承一个类,也是一种好方法。 举个例子,我们定义一个类A,它需要实现接口B,又由于类A跟我们以前的设计好的一个类C在功能上有很大的关联,为了充分复用已有的代码,我们打算让类A继承类C。但同时我们以前还有一个类D,它很好的实现了类A所要实现的接口B,只需要继承扩充一下就可以满足我们目前的需要,在这种情况下,我觉得一个很好的办法就是: class A extends C implements B { private class E extends D { ... } private E e = new E(); public void oneMethodOfInterfaceB() { e.oneMethodOfInterfaceB(); } } 这难道不是一个转基因的“多继承”吗?:)以上是少是偶能一下子想到的内隐类的用处。 当然,虽然内隐类的提出当初是因为某些具体的需要。但一旦作为Java语言的一种语法实体被提出并完备地定义出来,在实际中便非常可能遇到一些可能连当初内隐类的发明者都没有想到,但内隐类又的确能够解决的问题。作为语言的学习者,我们的目标是充分利用语言的功能来解决实际中的问题,我们必然也会在实际工作中发现内隐类的其他用处。这一切仅仅要求我们首先熟练掌握内隐类的语法和性质就可以了,每当我们感觉可以用的时候,就大胆的用。 毕竟,没有了内隐类,Java的OO会逊色一些,偶觉得。
因为有些对象只用唯一一次,所以java的设计者认为不必要为它特意起一个名字,所以用了内部类解决此问题---出自thinking in java
至于匿名的内隐类,偶觉得至少能提供了更大的语法灵活性,编程的时候,有时如果能一下子写下去,脑子里别打岔,自然就是好事情。否则可能经常会写着写着,发现需要一个类(可能很小的一个类),于是就得停下来,去定义这个类,然后再回过头来接着写,不仅打断了思路,搞得类也有一大堆。而有了匿名内隐类,就不用了,定义类以及实例化对象的过程可以一步到位。举个更特殊的例子,有一个类A,是我们以前设计好的,或者是库里的。它有好多好多方法,几乎所有的方法都能满足我们新的需求,可以直接拿过来用,唯独某个方法f,需要再把功能扩充一下才能满足现在的需求。 这时候怎么办?就为了f大张旗鼓地从A派生一个类,然后专门override f么?何必呢?有了内隐类,就可以直接利用那个“基本”符合你要求的类来定义一个“完全”符合你要求的对象: A a = new A() { public void f() { // New implementation. } };
to steedhorse(晨星): 在Java中,“一切都是对象”,而对象就是类的实例。所以Java图形界面库的设计者把一个图形界面元素所能响应的某一事件也定义成一个类。所以匿名内部类主要用于图形界面对事件的监控有了内隐类,就可以直接利用那个“基本”符合你要求的类来定义一个“完全”符合你要求的对象:看了书上的一些例子,有所认识!同时也谢谢其他热心各位。
http://www.wgqqh.com/shhgs/tij.html
使用Java Swing开发GUI程序,到处都会用到内部类。
设想一下你设计一个类,不妨叫A,它表示一个图形界面元素,通常,这样一个类除了拥有一般类的属性、方法之外,还应该能够“响应一些事件”,而这个特性并非一般的属性或者方法所能直接表现或者直接实现出来的。
在Java中,“一切都是对象”,而对象就是类的实例。所以Java图形界面库的设计者把一个图形界面元素所能响应的某一事件也定义成一个类。
假如你也这样设计,为类A的某个事件响应定义了类B,现在面临的问题是:类B是类A的事件(或者对象b代表了对象a所能响应的一个事件),而不是一个跟类A没有任何关系的类。那么类B为了在其事件响应过程中处理类A中的一些数据(响应事件的目的通常也就是这个),那么类B必然会产生这样的需要:它最好能直接访问类A的数据成员。
而Java中没有C++的友元机制,试问针对这种需要,还有比内隐类更合适的方法么?如果你用一下Java Swing,你就会发现:没有内隐类,就没有整个Swing库。所以,至少是到目前为止,内隐类是Java语言实现事件驱动程序设计的最重要的机制。还有,Java并不像C++那样支持多继承,于是不能直接同时拥有两个类的性质,也不能直接同时实现两个接口,这时候,使用组合的方式固然也能够解决问题,但许多时候,或许让一个类本身继承一个类,然后让这个类的内隐类再继承一个类,也是一种好方法。
举个例子,我们定义一个类A,它需要实现接口B,又由于类A跟我们以前的设计好的一个类C在功能上有很大的关联,为了充分复用已有的代码,我们打算让类A继承类C。但同时我们以前还有一个类D,它很好的实现了类A所要实现的接口B,只需要继承扩充一下就可以满足我们目前的需要,在这种情况下,我觉得一个很好的办法就是:
class A extends C implements B {
private class E extends D {
...
}
private E e = new E(); public void oneMethodOfInterfaceB() {
e.oneMethodOfInterfaceB();
}
}
这难道不是一个转基因的“多继承”吗?:)以上是少是偶能一下子想到的内隐类的用处。
当然,虽然内隐类的提出当初是因为某些具体的需要。但一旦作为Java语言的一种语法实体被提出并完备地定义出来,在实际中便非常可能遇到一些可能连当初内隐类的发明者都没有想到,但内隐类又的确能够解决的问题。作为语言的学习者,我们的目标是充分利用语言的功能来解决实际中的问题,我们必然也会在实际工作中发现内隐类的其他用处。这一切仅仅要求我们首先熟练掌握内隐类的语法和性质就可以了,每当我们感觉可以用的时候,就大胆的用。
毕竟,没有了内隐类,Java的OO会逊色一些,偶觉得。
在java jdk中有好多类都包含内部类Arrays 中的ArrayList
Collections 中一大堆.
回复人: steedhorse(晨星) ( ) 信誉:110
讲的很好.
匿名内,好像主要在swing常见
这时候怎么办?就为了f大张旗鼓地从A派生一个类,然后专门override f么?何必呢?有了内隐类,就可以直接利用那个“基本”符合你要求的类来定义一个“完全”符合你要求的对象:
A a = new A() {
public void f() {
// New implementation.
}
};
在Java中,“一切都是对象”,而对象就是类的实例。所以Java图形界面库的设计者把一个图形界面元素所能响应的某一事件也定义成一个类。所以匿名内部类主要用于图形界面对事件的监控有了内隐类,就可以直接利用那个“基本”符合你要求的类来定义一个“完全”符合你要求的对象:看了书上的一些例子,有所认识!同时也谢谢其他热心各位。