在另一个类中定义的类就是嵌套类(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(小应用程序)时是特别有帮助的。后面将继续解说,在那里你将看到对于某些类型的事件内部类如何被用来简化代码。你也将了解匿名内部类,它是一个没有名字的内部类。

Java基础篇:介绍嵌套类和内部类相关推荐

  1. 【java开发系列】—— 嵌套类与内部类

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...

  2. Java基础篇之常用类(1)

    目录 常用API: Scanner: object类: to String()方法: equals()方法: String类: String类创建对象的特点: String练习之模拟用户登录: Str ...

  3. Java基础篇:常用类

    文章目录 1.字符串相关的类 1.1 String类及常用方法 String的特性 String对象的创建 字符串对象是如何存储的 String使用陷阱 String常用方法 1.2 StringBu ...

  4. Java基础篇:嵌套 switch 语句

    可以将一个switch语句作为一个外部switch语句的语句序列的一部分,这称为嵌套switch语句.因为一个switch语句定义了自己的块,外部switch语句和内部switch语句的case常量不 ...

  5. Java基础复习-4-抽象类、内部类、接口

    目录 抽象类 一.概述 二.代码实例 **实例解析** 内部类 内部类分为:成员内部类,局部内部类以及匿名内部类 不同种类类的修饰符 局部内部类的final 匿名内部类(重要) 匿名对象是什么呢?请看 ...

  6. Java基础篇之LinkedList类

    LinkedList类扩展AbstractSequentialList并执行List接口.它提供了一个链接列表数据结构.它具有如下的两个构造函数,说明如下: LinkedList( ) LinkedL ...

  7. 【JAVA基础篇】String类详解

    昨天参加了一场机试,发现自己居然对String类的api不熟了,所以今天来总结一下(基于JDK1.8). 1.父类和实现的接口 没有父类,或者说父类是Object 接口:Serializable.Co ...

  8. Java基础篇:嵌套 if 语句

    嵌套(nested)if语句是指该if语句为另一个if或者else语句的对象.在编程时经常要用到嵌套if语句.当你使用嵌套if语句时,需记住的要点就是:一个else语句总是对应着和它在同一个块中的最近 ...

  9. JAVA基础篇【工具类】MathUtil 数学运算辅助类TG【20130324整理】

    数学运算辅助类,希望对大家有所帮助 import java.math.BigDecimal; /** * 数学运算辅助类. * * @author Elfy * @date 2013年03月21日 * ...

最新文章

  1. 不用se11创建表结构,作smartforms
  2. 【Java基础】异常
  3. python发明者叫什么-近 50 年来最具影响力的 10 种编程语言,都是谁发明的?
  4. 05传智_jbpm与OA项目_部门模块中增加部门的jsp页面增加一个在线编辑器功能
  5. 信息系统管理19年真题选择题
  6. ChineseDiachronicCorpus项目,大规模中文历时语料库
  7. Git - git tag - 查看当前分支 tag 版本说明
  8. CVPR 2020丨更精准的视频目标检测:基于记忆增强的全局-局部整合网络的方法
  9. Spring main方法中怎么调用Dao层和Service层的方法
  10. unity 下一帧执行_Unity中的Havok Physics物理引擎
  11. 简单介绍小系统车载中控导航上蓝牙模块
  12. windows下的文件服务器监控
  13. 协同办公软件竞品分析
  14. Android自定义View,画一个好看带延长线的饼状图
  15. 《IT项目沟通管理与演讲技巧》-大型免费讲座活动
  16. llq考试 圣诞欢乐赛 (第二发)
  17. 适用于 Windows 7 SP1 和 Windows Server 2008 R2 SP1 的扩展安全更新(ESU)许可准备程序包
  18. 一帘心事碎碎念,一眸雪舞剪剪风
  19. Windows把C盘容量分配到D盘或者把D盘容量分配到C盘
  20. Qlik之的应用备份(.qvf) (六)

热门文章

  1. [转载] 字符串最长重复子串python_查找字符串中重复字符的最长子字符串
  2. [转载] numpy.dot numpy.linalg.eig numpy.linalg.svd np.linalg.inv 用法 + 例子
  3. ARM、DSP、FPGA的区别
  4. Vivado中的Incremental Compile增量编译技术详解
  5. [转帖]规模化敏捷-简要对比SAFe、LeSS和DAD模式
  6. TCP/IP网络编程之域名及网络地址
  7. Linux设备驱动中的异步通知
  8. Xfire的aegis绑定方式配置小结
  9. 查询结果做缓存的例子
  10. yolo之---非极大值抑制