java允许在一个类中定义另外一个类,这就叫类嵌套。类嵌套分为两种,静态的称为静态嵌套类,非静态的称为内部类。

使用嵌套类的原因:

能够将仅在一个地方使用的类合理地组合。一个类可能只对于另外一个类有用,此时将前者组合到后者,可以使得程序包更加简洁。

增强封装性。假如由两个类A和B,B类需要使用A类中的成员,而恰好该成员又是仅类内部可见的,如果将B定义为A的嵌套类,则B可以使用A的任何成员,而且B也可以声明为外部不可见。

能够使代码可读性和维护性更强。嵌套的类代码相较于顶级类,更靠近它被使用的地方,方便查看。

嵌套类也属于类的成员,因此也可使用类成员的可视范围控制修饰词,内部类能够使用其所在类的其他类成员,而静态嵌套类则不能使用其所在类的其他类成员。

静态嵌套类

与静态方法与静态字段类似,静态嵌套类是与其所在类相关的。静态嵌套类不能直接使用实例变量或者实例字段,而只能通过一个对象引用,可将静态嵌套类视为跟其他顶级类一样,只不过是内嵌在其他类里面,方便打包。

静态嵌套类的使用方法与类中的其他类成员类似,一下演示如何创建静态嵌套类对象://StaticNestedClass为OuterClass的一个嵌套类OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

内部类(非静态嵌套类)

内部类是与其所在类的实例相关的 ,能够直接使用实例对象的方法和字段,内部类与实例相关,所以内部类不能定义静态的成员。

如果需要创建内部类对象,首先需要创建该内部类所在的类的对象,如下所示://1创建内部类所在类的对象OuterClass outerObject=new OuterClass();//2创建内部类对象

//注意与静态嵌套类的构造器使用方法的差异OuterClass.InnerClass innerObject = outerObject.new InnerClass();

嵌套类的遮蔽

当我们声明一个类型时,如果其名称与当前代码块(如一个方法内部)所在的代码块(如类内部)内的另一个类型的声明含有相同的名称,这种现象就叫遮蔽。需要用到被遮蔽的类型时,我们不能直接引用其名称,如下例所示:public class ShadowTest {

public int x = 0;

//嵌套类

class FirstLevel {

//以下声明会遮蔽其所在类的名称为x的字段

public int x = 1;

//以下方法的声明会遮蔽其所在类的名称为x的字段

void methodInFirstLevel(int x) {

System.out.println("x = " + x);

System.out.println("this.x = " + this.x);

System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//注意this关键词的使用方法

}

}

public static void main(String... args) {

ShadowTest st = new ShadowTest();

ShadowTest.FirstLevel fl = st.new FirstLevel();

fl.methodInFirstLevel(23);

}

}

上述代码输出为:

x = 23

this.x = 1

ShadowTest.this.x = 0

序列化,教程中强烈建议不要序列化内部类,在此留下疑问。

除了非静态嵌套类意外,还有两种内部类,一种是局部类,还有一种是匿名类。

局部类

局部类可以在任何代码块(花括号内)中定义,一般应用于方法之中。

局部类可以使用其所在顶级类的类成员,此外,局部类也可以使用局部变量,然而,其所使用的局部类必须有final关键词修饰,即不可变变量。在java SE8中,局部类可以使用本质上不变的局部变量,即该局部变量即便没有final关键词修饰,但实际上从初始化以后,其值从未改变过。

从java8开始,局部类也可以使用其所在方法的参数。

与内部类相似,局部类不能定义静态成员,在静态方法中定义的局部类不能使用实例成员。

在代码块中不能定义接口,因为接口本质是静态的。局部类中也不能定义借口成员,不过局部类中可以定义常量变量(用final修饰,类型为基本数据类型或者字符串,编译时进行初始化)。

匿名类

匿名类能是代码更加简洁,它不需要名称,可以声明,实例化一步完成。

匿名类的声明是一个表达式,如同调用一个构造器,不同的是其后还跟上了一个定义类的代码块。

匿名类的定义的表达式包含如下几个部分:

new关键词

一个该匿名类需要实现的借口或者是继承的父类的名称

一对圆括号,包含参数,实现一个接口时,参数部分留空

匿名类主体,跟类的主体类似, 可以定义方法

匿名类对于可使用的类型与局部类相同:

可使用其所在类的类成员

可使用其所在代码块的带final修饰词的局部变量,或者初始化后不再赋值的局部变量(java8)

对于遮蔽的类型,不能直接用名称引用

同样匿名类不能声明静态的成员或者接口,但是可以声明常量变量,在匿名类的类主体中,可以声明实例字段,实例方法,实例初始化代码块和局部类。

相关标签:java

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

java类嵌套_java-嵌套类相关推荐

  1. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...

    在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...

  2. java 嵌套类 作用_java 嵌套类的分类、为什么使用嵌套类?

    java程序语言允许你在一个类里面再声明另一个类,这样的类成为嵌套类,说明如下:class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两 ...

  3. java 虚拟机 初始化_Java虚拟机 类初始化 阶段

    Java虚拟机使用某个类的过程,可分为七个阶段: 加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 本文只介绍在什么情况下对类进行初始化. Java虚拟机规范对何时进行类的初始化做了 ...

  4. java 9对象_java(9)类和对象

    一.理解什么是类和对象 万事万物皆对象 1.1.属性--对象具有的特征(特点) 1.2.方法--对象可执行的操作(能干什么事) 1.3.对象的定义: 是一个客观存在的,看的见或摸得着的实体,由属性和方 ...

  5. java+character类使用_Java Character类应用实例

    之前给大家讲了一下什么是Java Character类以及它的常用方法,下面的话要给大家分享的就是Java Character类的应用实例. 在注册会员的时候,要验证用户输入的用户名.密码.性别.年龄 ...

  6. java组合语法_JAVA复用类之组合语法的使用(附源码)

    复用代码是Java众多引人注目的功能之一.但是要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情. 上述方法常为C这类过程型语言所使用,但收效并不是很好.正如J ...

  7. java 枚举 注解_Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  8. java类图_java UML类图的使用-UML基础-火龙果软件工程

    类图 是用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据.学习好类图的绘制,是一位合格的软件工程师应有的技能 ...

  9. java异常判断_Java异常类

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  10. java file 工具_JAVA文件类工具

    FileUtil package cn.jiangzeyin.util.file; import org.springframework.util.Assert; import java.io.*; ...

最新文章

  1. 我们期待的TensorFlow 2.0还有哪些变化?
  2. 清华医工结合项目及三创项目与天津市27家重点医院对接
  3. SAP LIST 画框的FORM
  4. 影响线型缩聚物分子量的因素_运城专业超高分子量聚乙烯油井内衬管生产基地...
  5. zookeeper启动占用8080端口
  6. http://blog.csdn.net/myan/article/details/1906
  7. 英语影视台词---八、the shawshank redemption
  8. cryptojs支持rsa加密_新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接
  9. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式
  10. c++指针各种用法小结
  11. 大学生计算机网络游戏策划书,【大学校园活动策划方案】_大学生校园活动策划方案参考模板...
  12. python-format函数
  13. aide制作软件教程_Aide教程
  14. ora-01033错误恢复
  15. python 异常 exception_关于Python中异常(Exception)的汇总
  16. windows权限维持的方法
  17. UG/NX二次开发 单位化向量 UF_VEC3_unitize
  18. 钟站壤赴梅拱厩沼泊叶
  19. 前端从入门到大前端学习流程总结
  20. 水经注离线三维地球触摸GIS系统

热门文章

  1. Ios王者微信抢先服务器,王者荣耀:iOS微信用户抢先体验!国服出装铭文,点击一键查看!...
  2. 中国android手机市场占有率,Android成全球第二大手机系统 市场份额达26%
  3. Win10蓝屏原因查找以及解决
  4. Excel基础—文件菜单之设置选项
  5. [Swift]LeetCode1108. IP 地址无效化 | Defanging an IP Address
  6. 获取月份的第一天和最后一天
  7. Oracle 数据库中的多种SCN汇总
  8. 基于MRS-Hudi构建数据湖的典型应用场景介绍
  9. 1.8寸TFT屏幕显示汉字 PcToLCD2002完美版配置
  10. 令人惊叹的、不起眼的硅片