0

0

java-嵌套类

高洛峰

高洛峰

发布时间:2016-11-05 16:31:23

|

2680人浏览过

|

来源于php中文网

原创

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

使用嵌套类的原因:

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

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

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

立即学习Java免费学习笔记(深入)”;

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

静态嵌套类

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

  静态嵌套类的使用方法与类中的其他类成员类似,一下演示如何创建静态嵌套类对象:

//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

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

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

局部类

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

js图片嵌套点击放大特效
js图片嵌套点击放大特效

js图片嵌套点击放大特效是一款适合远景效果图展示的js特效代码。

下载

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

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

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

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

匿名类

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

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

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

new关键词

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

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

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

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

可使用其所在类的类成员

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

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

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

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 45.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号