JAVA_SE基础——51.内部类
在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.内部类的更多相关文章
- JAVA_SE基础——6.标识符&关键字
学会写helloworld之后, 我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...
- JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别
黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看 JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...
- JAVA_SE基础——9.基本数据类型间的转换
前面我已经教会大家基本的数据类型进行了介绍, 然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...
- JAVA_SE基础——8.基本数据类型
基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...
- JAVA_SE基础——7.常量&变量
上一篇,我讲了标识符&关键字 这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...
- JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用
配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...
- JAVA_SE基础——4.path的临时配置&Classpath的配置
这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话 再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...
- JAVA_SE基础——2.环境变量的配置&测试JDK
哈喽,利用晚上的空余时间再写篇心的~~~ 谢谢大家 前一篇文章 JAVA_SE基础--JDK&JRE下载及安装http://blog.csdn.net/thescript_j/article ...
- JAVA_SE基础——1.JDK&JRE下载及安装
这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...
随机推荐
- 在Service中抛出异常事务未回滚问题分析与解决
1.问题提出:在service中写方法时,抛出了一个Exception, 本来目的是为了让事务回滚, 但事实上没有回滚,产生了脏数据.代码如下:@Override@Transactionalpubli ...
- TP90 95 99指标
备忘下: 保证90%请求都能被响应的最小耗时 The tp90 is a minimum time under which 90% of requests have been served. tp90 ...
- scala开发环境安装
安装JDK java 运行环境 ,这里不详说了,熟悉java的朋友应该都会,我们主要关注下Scala的安装. 安装scala 1.下载scala http://yunpan.cn/c ...
- kubernetes1.9中部署dashboard
在1.9k8s中 dashboard可以有两种访问方式 kubeconfig(HTTPS)和token(http) 2018-03-18 一.基于token的访问1.下载官方的dashboardwge ...
- Windows cmd命令反斜杠问题
在Windows的终端输入命令的时候,如果在命令中存在斜杠就无法执行,因为它只支持反斜杠,而在Unix系统中是支持斜杠的,这是两者的区别.所以在Windows终端下执行命令需要注意斜杠问题
- 关于各种文件用Editplus的方式打开出现“向程序发送命令时出现问题”的解决方法
其实网上有很多解决方法,但是我试过都没有用. 我出现这个错误的原因是因为我的Editplus是以管理员的方式运行的,所以解决的办法有两种: 一.修改Editplus的兼容性,方法如下: 首先在Edit ...
- nginx的自动化安装和启停脚本
个人原创,转载请注明出处和作者,否则依法追究法律责任 author: headsen chen date: 2018-03-07 14:39:11 nginx_install.sh #!/bin/ ...
- Nginx配置ThinkPHP下的url重写(隐藏入口)
搭建好项目后,在网址上输入域名,只能访问首页,其他页面全是404. 在域名后面和控制器前面加上index.php就可以访问. 在tp5官网手册查找后进行配置修改. 打开nginx.conf 后 ,在s ...
- FNV算法实战
HASH算法介绍 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长 ...
- Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)
Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...