前言

定义

内部类(Inner Class),是 Java 中对类的一种定义方式,是嵌套类的一个分类,即非静态嵌套类(Non-Static Nested Class)。内部类(非静态嵌套类)分为成员内部类、局部内部类和匿名内部类三种。

Java 编程语言允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。没有用 static 关键字来声明的嵌套类,就称为非静态嵌套类。非静态嵌套类,又称为内部类。内部类还有两个特殊的类型:局部类(Local Class)和匿名类(Anonymous Class)。

包含嵌套类的类,可称为外围类(Enclosing Class)或外部类(Outer Class)。非静态嵌套类(内部类)可访问其外围类的其他成员,即使这些成员被声明为私有的。若内部类作为其外部类的成员,则它可声明为 privatepublicprotected 或包私有的。

  • 提示:外部类只能声明为 public 或包私有的。

概述

作为其外部类成员的内部类,称为成员内部类。除另有说明外,“内部类”通常是指成员内部类。

与实例的方法和变量一样,内部类与其外围类的实例相关联,并可直接访问该外围类对象的方法和字段。此外,由于内部类与实例相关联,因此不能在内部类中定义任何静态成员。

 /**
* 定义一个公共的 OuterClass 类。
*/
public class OuterClass {
private final String name; public static void main(String[] args) {
String name = "Java";
OuterClass outerObject = new OuterClass(name);
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
System.out.println(outerObject.getName());
System.out.println(innerObject.getName());
} /**
* 定义一个 OuterClass 类的构造方法。
*
* @param name 表示一个名称字符串。
*/
public OuterClass(String name) {
this.name = name;
} public String getName() {
return name;
} /**
* 定义一个私有的 InnerClass 类。
*/
private class InnerClass {
private final String name; /**
* 定义一个 InnerClass 类的构造方法。
*/
public InnerClass() {
name = OuterClass.this.name + " (in the inner object)";
} public String getName() {
return name;
}
}
}
/* 输出结果:
Java
Java (in the inner object) */

在上述示例中,InnerClass 类的实例只能存在于 OuterClass 类的实例中,并且可以直接访问 OuterClass 类的实例的方法和字段。

要实例化内部类,就必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

         OuterClass.InnerClass innerObject = outerObject.new InnerClass();
  • 提示:可以用内部类来实现助手类(Helper Class)。如要处理用户界面的事件,就必须知道如何使用内部类,因为内部类广泛地使用在事件处理机制上。

遮蔽 - 重名问题

 public class Outer {
String name = "这是外部类的成员变量名";
int num = 12; public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
int num = 56;
inner.methodInInner(num);
} public Outer() {
} class Inner {
String name = "这是内部类的成员变量名";
int num = 34; public Inner() {
} void methodInInner(int num) {
String name = "这是内部类方法的局部变量名";
System.out.println("name:" + name);
System.out.println("this.name:" + this.name);
System.out.println("Outer.this.name:" + Outer.this.name);
System.out.println("================================");
System.out.println("num = " + num);
System.out.println("this.num = " + this.num);
System.out.println("Outer.this.num = " + Outer.this.num);
}
}
}
/* 输出结果:
name:这是内部类方法的局部变量名
this.name:这是内部类的成员变量名
Outer.this.name:这是外部类的成员变量名
================================
num = 56
this.num = 34
Outer.this.num = 12 */

在上述示例中,外部类的字符串成员变量、内部类的字符串成员变量和内部类方法的字符串局部变量发生重名,则内部类方法的字符串局部变量的声明,遮蔽了外部类和内部类中的同名成员变量的作用域(如同将二者隐藏起来),使二者不能仅以名称来引用。

同样的,外部类的整型成员变量、内部类的整型成员变量和内部类方法的整型参数发生重名,则内部类方法的整型参数的声明,遮蔽了外部类和内部类中的同名成员变量的作用域(如同将二者隐藏起来),使二者不能仅以名称来访问使用。

如需在内部类方法中访问内部类的重名成员变量,请使用 this 关键字,如下:

             System.out.println("this.name:" + this.name);
System.out.println("this.num = " + this.num);

如需在内部类方法中访问外部类的重名成员变量,请使用外部类名加 this 关键字,如下:

             System.out.println("Outer.this.name:" + Outer.this.name);
System.out.println("Outer.this.num = " + Outer.this.num);

禁止序列化 - 兼容性问题

Java 语言强烈建议禁止对内部类(包括局部类和匿名类)进行序列化。

Java 编译器编译某些构造方法(如内部类)时,它会创建合成结构。与合成结构相关的类及其构造方法、字段和方法,在源代码中是没有的。合成结构能使 Java 编译器实现新的 Java 语言特性,而无需对 JVM 进行更改。

然而,不同的 Java 编译器可能会创建不同的合成结构,这意味着 .class 文件在不同的实现中也会有所不同。因此,如果将内部类序列化,然后用不同的 JRE 将其反序列化,则可能会出现兼容性问题。

局部类和匿名类

局部类和匿名类是内部类的两个特殊的类型。

在方法体中声明的内部类,称为局部内部类,亦称局部类。局部类是有类名的。

在方法体中声明的无需命名的内部类,称为匿名内部类,亦称匿名类。匿名类是没有类名的。

Java | 内部类(Inner Class)的更多相关文章

  1. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  2. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  3. 黑马----JAVA内部类

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...

  4. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  5. java内部类和匿名内部类

    内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...

  6. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  7. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  8. java内部类的作用分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  9. 9)Java内部类(Inner Class)

      内部类:不可以有静态数据,静态方法或者又一个静态内部类      内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静 ...

  10. JAVA内部类(转)

    源出处:JAVA内部类 在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部.内部类作为其外部类的一个成员,与其他成员一样, ...

随机推荐

  1. vnc server,vnc server去哪下载,下载后如何连接使用(vnc viewer)

    vnc server是vnc服务端,通过需要下载的服务器连接之后在服务器端下载. 1.使用到的工具:iis7服务器管理 2.首先去服务器端下载vnc 3.根据要求安装结束,得到登录密码. 4.用IIS ...

  2. Java工作流框架jflow 集团应用模式用户组功能

    关键字 驰骋BPM ,工作流开发框架,用户组,接受人规则,用户组发起人范围,选择人范围. 集团工作模式. Ccflow ,jflow.工作流引擎 名词定义与应用背景 对于集团模式的ccflow,jfl ...

  3. Rocket - util - Annotations

    https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg   介绍util中定义的注解(Annotations).   ​​   1. Annotation ...

  4. SpringMVC(三)Restful风格及实例、参数的转换

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...

  5. 利用init进程监控底层节点的方法架构

    native层利用底层节点变化,再针对变化进行相应的函数调用,实现某些功能. 架构如下: 底层提供节点更新,以及healthd读取节点的实现,都比较简单.而其余部分比较关键. 特别注意init监控pr ...

  6. Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

    1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...

  7. ASP.NET MVC 数据传递进阶 从数据库拿到数据后的三种方式

    目录 回顾 数据 显示 因为这个小练习有EF的一些东西,我们来回顾一下. 一.回顾 回顾一点EF的知识怎么生成数据库模型. 1.首先我们在Models文件夹右键添加新建项,在数据分栏下有ADO.NET ...

  8. Java实现 蓝桥杯VIP 算法训练 数组查找及替换问题

    描述 给定某整数数组和某一整数b.要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序.如果数组元素数值在A到Z的ASCII之间,替换为对应字母.元素个数不超过100,b在1至100 ...

  9. Java实现 洛谷 P1055 ISBN号码

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  10. java实现第六届蓝桥杯垒骰子

    垒骰子 题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...