在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为成员内部类、静态内部类、方法(局部内部类)内部类。

内部类:一个类定义在另外一个类的内部,那么该类就称作为内部类。



内部类的class文件名: 外部类$内部类.  好处:便于区分该class文件是属于哪个外部类的。

成员内部类

在类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。

成员内部类的访问方式:



方式一:在外部类提供一个方法创建内部类的对象进行访问。code1使用此方式



方式二:在其他类直接创建内部类的对象。code2使用此方式

格式:外部类.内部类  变量名 = new 外部类().new 内部类();

code1

class A{
int num = 10 ;
//下面的代码定义了一个成员方法,方法中访问内部类
public void test(){
B a = new B() ;
a.show() ;
}
//下面的代码定义了一个成员内部类
class B{
public void show(){
System.out.println("num = "+num) ;
}
}
}
class Demo1{ public static void main(String[] args) {
A a = new A() ;
a.test() ;
}
}

运行结果:

num = 10

code2

class A{
int num = 10 ; //下面的代码定义了一个成员内部类
class B{
public void show(){
System.out.println("num = "+num) ;
}
}
}
class Demo2{ public static void main(String[] args) {
A.B a = new A().new B() ;
a.show() ;
}
}

运行结果:

num = 10

内部类的好处:内部类可以直接访问外部类的所有成员。

静态内部类

可以使用static关键字来修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化(因为静态内部类随着外部类的加载而加载)。

静态内部类,在其他类创建 的格式:

外部类.内部类  变量名 = new 外部类.内部类();  code3使用此方式

code3

class A{
//定义静态成员变量
static int num = 10 ; //下面的代码定义了一个静态内部类
static class B{
public void show(){
System.out.println("num = "+num) ;
}
}
}
class Demo3{ public static void main(String[] args) {
A.B a = new A.B() ;
a.show() ;
}
}

运行结果:

num = 10

P.S.

在静态内部类中只能访问外部类的静态方法,如果将外部类的静态成员num的static关键字去掉,将会报错

在静态内部类中可以定义静态的成员,而在非静态的内部类中不允许定义静态的成员。(因为内部类中的静态成员随着内部类的加载而加载,但是这样违背了当初sun公司定义的:静态的成员数据是不需要对象存在才能访问。)

方法内部类(局部内部类)

方法内部类是指在成员方法中定义的类,它只能在当前方法中被使用。

局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。

局部内部类要注意的细节:

局部内部类可以访问外部类的成员变量、code4实现了此句话

如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰(java1.8以下 局部变量没有用final修饰会报错)、  (我的java1.8  试验过了,没有final也不会报错,估计优化了吧。。

code4

class A{
int num = 10 ; //下面的代码定义了一个成员内部类
public void test(){ class B{
public void show(){
System.out.println("num = "+num) ;
}
}
//由于B类是方法内部类,因此只能在方法中创建该类的实例对象并调用show()方法、
B b = new B() ;
b.show() ;
} }
class Demo4{ public static void main(String[] args) {
A a = new A() ;
a.test() ;
}
}

运行结果:

num = 10

在A类的test()方法中定义了一个内部类B ,由于B类是方法的内部类,因此程序只能在方法中创建该类的实例对象并调用show()方法。 从结果上看,方法内部类可以访问外部类的成员变量。

看完本章节觉得对自己都帮助的,写个评论顶顶

JAVA_SE基础——51.内部类的更多相关文章

  1. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  2. JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别

    黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看  JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...

  3. JAVA_SE基础——9.基本数据类型间的转换

    前面我已经教会大家基本的数据类型进行了介绍,   然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...

  4. JAVA_SE基础——8.基本数据类型

    基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...

  5. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  6. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  7. JAVA_SE基础——4.path的临时配置&Classpath的配置

    这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话  再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...

  8. JAVA_SE基础——2.环境变量的配置&测试JDK

    哈喽,利用晚上的空余时间再写篇心的~~~  谢谢大家 前一篇文章 JAVA_SE基础--JDK&JRE下载及安装http://blog.csdn.net/thescript_j/article ...

  9. JAVA_SE基础——1.JDK&JRE下载及安装

    这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...

随机推荐

  1. Django入门-基本数据库API

    # 现在系统里还没有 Question 对象 >>> Question.objects.all() <QuerySet []> # 创建新 Question # 在 se ...

  2. java 实现登录验证码 (kaptcha 验证码组件)

    验证码的作用: 1.防止广告机注册和发帖.评论.2.防止暴力破解密码,特别是有管理员权限的密码. 在这里介绍一种非常实用的验证码生成工具:kaptcha 这个工具,可以生成各种样式的验证码,因为它是可 ...

  3. 2018第一波iOS经典笔试题(现场实拍)

    序言 作为一个开发者,眼里不仅仅只存在于那一行又一行的代码,更还有那诗和远方. 注明:面试是对自我审视的一种过程,面试题和iOS程序员本身技术水平没任何关联,无论你能否全部答出,都不要对自己产生任何正 ...

  4. 浅谈API安全设计

    一.简述 安全是恒久的话题,如果不注意防范,会带来很严重的后果.比如: 1.接口被大规模调用消耗系统资源,影响系统的正常访问,甚至系统瘫痪 2.数据泄露 3.伪造(篡改)数据,制造垃圾数据 4.App ...

  5. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  6. html学习第二弹の表格的使用方法

    >创建表格的四个元素: table.tbody.tr.th.td 1.<table>-</table>:整个表格以<table>标记开始.</table ...

  7. c++cout执行顺序之一个不容易注意到的一点

    二话不说,先看一个例子 #include <iostream> using namespace std; int main() { ]={,,,,,,,,,}; int *p=a; int ...

  8. python web开发-flask中response,cookies,session对象使用详解

    Response响应对象: 当一个web请求被服务器处理完后,会返回用户请求的响应,这时候就要用到响应对象,根据响应给用户的形式不同,响应对象有以下几种处理方式 如果返回的是一个合法的响应对象,它会从 ...

  9. IPFS家族(二)

    go-ipfs IPFS协议的go语言实现,ipfs的核心协议,最新版是v0.4.13 下载地址:https://dist.ipfs.io/#go-ipfs 源代码地址:https://github. ...

  10. NGUI_slider

    十一.进度条UISlider 1.一般按以下规律使用进度条; 如果某一钟值,他有最大值,需要表达当前的值得占比,则可以使用不可拖动的进度条 如果某一值,他有最大值,需要玩家记性滑动设置,则可以使用可拖 ...