JR 精品文章 - 介绍嵌套类和内部类
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » Java入门 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
介绍嵌套类和内部类
lingwen20 整理   更新:2006-11-11 02:38:33  版本: 1.0   

介绍嵌套类和内部类 [java虫虫 发表于 2005-10-18 11:13:45]

在另一个类中定义的类就是嵌套类(nested classes)。嵌套类的范围由装入它的类的范围限制。这样,如果类B被定义在类A之内,那么B为A所知,然而不被A的外面所知。嵌套类可以访问嵌套它的类的成员,包括private 成员。但是,包围类不能访问嵌套类的成员。

嵌套类一般有2种类型:前面加static标识符的和不加static 标识符的。一个static的嵌套类有static修饰符。因为它是static,所以只能通过对象来访问它包围类的成员。也就是说,它不能直接引用它包围类的成员。因为有这个限制,所以static嵌套类很少使用。

嵌套类最重要的类型是内部类(inner class)。内部类是非static的嵌套类。它可以访问它的外部类的所有变量和方法,它可以直接引用它们,就像外部类中的其他非static成员的功能一样。这样,一个内部类完全在它的包围类的范围之内。

下面的程序示例了如何定义和使用一个内部类。名为Outer 的类有一个名为outer_x 的示例变量,一个名为test()的实例方法,并且定义了一个名为Inner 的内部类。

// Demonstrate an inner class.
class Outer {
int outer_x = 100; 


void test() { 
Inner inner = new Inner();
inner.display();




// this is an inner class class Inner { void display() {System.out.println("display: outer_x = " + outer_x); }}} 

class InnerClassDemo {

public static void main(String args[]) { 
Outer outer = new Outer();
outer.test();


}



该程序的输出如下所示:

display: outer_x = 100 

在本程序中,内部类Inner 定义在Outer 类的范围之内。因此,在Inner 类之内的任何代码可以直接访问变量outer_x 。实例方法display() 定义在Inner 的内部,该方法以标准的输出流显示 outer_x 。InnerClassDemo 的main( ) 方法创建类Outer 的一个实例并调用它的test( )方法。创建类Inner 和display() 方法的一个实例的方法被调用。

认识到Inner 类只有在类Outer 的范围内才是可知的是很重要的。如果在类Outer 之外的任何代码试图实例化Inner 类,Java 编译器会产生一条错误消息。总体来说,一个嵌套类和其他任何另外的编程元素没有什么不同:它仅仅在它的包围范围内是可知的。

我们解释过,一个内部类可以访问它的包围类的成员,但是反过来就不成立了。内部类的成员只有在内部类的范围之内是可知的,而且不能被外部类使用。例如:

// This program will not compile.
class Outer {
int outer_x = 100; 


void test() { 
Inner inner = new Inner();
inner.display();




// this is an inner class
class Inner { 
int y = 10; // y is local to Inner
void display() {


System.out.println("display: outer_x = " + outer_x); 
}
}


void showy() { System.out.println(y); // error,y not known here!}} 

class InnerClassDemo {

public static void main(String args[]) { 
Outer outer = new Outer();
outer.test();


}



这里,y是作为Inner 的一个实例变量来声明的。这样对于该类的外部它就是不可知的,因此不能被showy() 使用。

尽管我们强调嵌套类在它的外部类的范围之内声明,但在几个程序块的范围之内定义内部类是可能的。例如,在由方法定义的块中,或甚至在for 循环体内部,你也可以定义嵌套类,如下面的程序所示:

// Define an inner class within a for loop.
class Outer {
int outer_x = 100; 


void test() { for(int i=0; i<10; i++) { class Inner { void display() {System.out.println("display: outer_x = " + outer_x); 

}
}
Inner inner = new Inner(); 
inner.display();


}
}



class InnerClassDemo {

public static void main(String args[]) { 
Outer outer = new Outer();
outer.test();


}



该程序的这个版本的输出如下所示。

display: outer_x = 100
display: outer_x = 100
display: outer_x = 100 


display: outer_x = 100
display: outer_x = 100
display: outer_x = 100
display: outer_x = 100
display: outer_x = 100
display: outer_x = 100
display: outer_x = 100 


尽管嵌套类在日常的大多数编程中不使用,但当处理applet (小应用程序)时是特别有帮助的。在第20章中我们将继续嵌套类的话题。在那里你将看到对于某些类型的事件内部类如何被用来简化代码。你也将了解匿名内部类(anonymous inner classes),它是一个没有名字的内部类。

最后一点:嵌套类在Java 的最初的1.0版本中是不允许的。直到Java 1.1 中才添加了嵌套类。


版权声明  
本篇文章对您是否有帮助?  投票:         投票结果:     11       1
作者其它文章: 作者全部文章
评论人:laoda1204 发表时间: Sun Nov 12 12:08:00 CST 2006
dddddddddddddddddddddd
评论人:yongbing 发表时间: Sun Dec 03 12:29:50 CST 2006
好,顶一个
评论人:mrou2001 发表时间: Wed Dec 06 22:18:44 CST 2006
不错的文章[java]
评论人:suihu 发表时间: Wed Feb 07 16:15:04 CST 2007
[:E]

这个文章共有 4 条评论
主题: JAVA基础知识精华总结 上一篇文章
返回文章列表 返回〔Java入门〕
下一篇文章 主题: 《深入Spring2》终于开始发布电子版本了


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号