分享知识-快乐自己:快速理解(Java内部类)
1):成员内部类
什么是内部类?:
内部类就是在一个类中定义另一个类。
定义语法:
使用命令行查看编译 产生的文件:
如何生成内部类对象?
创建规则:内部类对象 需要先声明外部类对象。
内部类以及外部类的成员变量、方法 的使用?
上图所示:
编译是可以通过的,语法上是没有错误的。
其实这个地方很容易会产生一个错觉,就好像这个 i 也变成了 B的成员,那是不是说B作为A的内部类 B是不是继承了A那?(其实不是这样的 X)内部类和继承了关系一定要搞清楚,这两者并不是一样的。
B是A的内部类就意味着在B当中可以随意使用A当中的成员变量及方法。但是这不是意味着B继承了A。
B只是能够使用A中的成员变量;而B并不拥有A的成员
为什么可以使用那?(观察以下图)
当生成内部类对象的时候,它首先先生成了一个外部类对象。也就是说每一个内部类都和一个外部类的对象 所关联。
上图所示:运行结果为 4 。i 所用的就是 a对象里面的。(完整写法如下:)
记住一点 内部类可以随意的使用外部类公共的成员。
2):局部内部类
特点:
1、类被定义在一个方法体中 或 代码块中
2、类上允许使用修饰符
3、编译的class文件会有 $1 标识
4、可以直接访问外部类的成员
5、可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。
下图所示:简单实现局部内部类。
问题来了...
会报错:num2 不是最终类型。
局部内部类访问局部变量的注意事项:
必须是 final修饰?
为什么?
因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立刻从堆内存中消失,还要使用那个变量。
为了让数据还能继续被使用,就用final修饰,这样在堆内存里面存储的其实是一个常量值。通过反编译工具可以看一下。
3):静态内部类
静态内部类如何声明那?
无非就是在内部的类上加上 static 关键字。
特点如下:
1、有static 修饰
2、可以有任意修饰符
3、不能访问私有的静态内部类
4、共有的内部类不依赖外部类对象,但是依赖外部类本身
5、可以访问外部类的静态属性及方法
使用静态内部类简单实现求最大值和最小值。
4):匿名内部类
所谓的匿名内部类是什么东西那?
首先它是一个内部类,其次没有名字
先看一个正常的流程案例:
1):定义一个接口
2):接口实现
3):定义B 类【A 作为参数】
4):调用运行
另一种写法:(匿名)
代码看起来有点可怕啰嗦,我们来解释一下。
首先我们确认一点 fun()需要一个A类型的对象作为参数。
这里我们写的是 new A()?
是不是有疑问,不是一直说接口不能new?
这里注意new A()后面的代码,大括号里面的这些代码和A的实现类中的几乎一模一样的几乎没有什么区别。这里只是打印的信息不一样。
那它的区别在里那?
主要区别在于它没有名字(称为匿名)那这个直接new的类A是不是在Test类里面 所以加起来就叫 内部匿名类。
New 它就是生成这个内部匿名类的对象
那么new的这个接口又是什么意思那?
也就是说 Test 这个类要实现 A这个接口。
分享知识-快乐自己:快速理解(Java内部类)的更多相关文章
- 夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木
学习JAVA不难,难的是没有多余的时间给你仔细学习. 伴随着项目的不断跟进,责任重于泰山,必须快速提升. 我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...
- Java 干货之深入理解Java内部类
可以将一个类定义在另一个类或方法中,这样的类叫做内部类 --<Thinking in Java> 说起内部类,大家并不陌生,并且会经常在实例化容器的时候使用到它.但是内部类的具体细节语法, ...
- 深入理解Java内部类
内部类就是定义在一个类中的另外一个类,是一种从属关系.在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度么?现在才大致能知道这种设计的优势是大于 ...
- 从反编译深入理解JAVA内部类类结构以及finalkeyword
1.为什么成员内部类能够无条件訪问外部类的成员? 在此之前,我们已经讨论过了成员内部类能够无条件訪问外部类的成员,那详细到底是怎样实现的呢?以下通过反编译字节码文件看看到底.其实,编译器在进行编译的时 ...
- 快速理解Java中的五种单例模式
解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static S ...
- 分享知识-快乐自己:初中级 java 面试题宝典
1):Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向 ...
- 快速理解Java中的五种单例模式(转)
解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static S ...
- 快速理解Java中的七种单例模式
饿汉式(推荐) package concurencyv2.chapter1; public class SingletonV2 { private static final SingletonV2 i ...
- 深入理解Java:内部类
什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...
随机推荐
- rmdir 命令
rmdir 不能删除非空目录 1.rmdir aa 删除空文件夹aa 2.rmdir -p aa 递归删除文件夹aa 当aa子文件夹被删除后aa也变成空文件夹的话aa也被删除
- synchronized是什么
在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchron ...
- 浅谈 MVP in Android(转)
我自己写的demo:https://pan.baidu.com/s/1dFImVYD 一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让 ...
- Linux mail发送邮件
发送前一天的监控日志#!/bin/bash source /etc/profile time=`date -d '-1 day' "+%Y%m%d"` #判断服务是否已经启动 se ...
- ios 动画 创建一个UIImageView并将其属性设置animationImages为UIImages 的数组
NSArray *animationFrames = [NSArray arrayWithObjects: [UIImage imageWithName:@"image1.png" ...
- centos7.0 安装pdo_mysql扩展
1:进入到源码包 /usr/local/php-7.1.6/ext/pdo_mysql 执行/usr/local/php-7.1/bin/phpize 如果报如下错误: Cannot find aut ...
- Eclipse 中svn的合并与同步
Eclipse 中svn的合并与同步: 1. 从主干拉取到分支: 然后一直下一步,到完成就OK了. 2. 从分支代码合并到主干: 2.1.先将本地需要提交更新的代码提交更新到svn分支去 2.2. ...
- Convex optimization 凸优化
zh.wikipedia.org/wiki/凸優化 以下问题都是凸优化问题,或可以通过改变变量而转化为凸优化问题:[5] 最小二乘 线性规划 线性约束的二次规划 半正定规划 Convex functi ...
- Django之CURD插件2
目标:达到下图拥有功能的实现 1.绑定编辑按钮 ************思路**************** 1.为编辑按钮添加样式,可以根据样式来进行判断在什么状态. 2.进入编辑模式,将可编辑的字 ...
- Android系统移植与调试之------->如何修改Android默认字体大小和设置里面字体大小比例
因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都 ...