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内部类)的更多相关文章

  1. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  2. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木

           学习JAVA不难,难的是没有多余的时间给你仔细学习.       伴随着项目的不断跟进,责任重于泰山,必须快速提升.       我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...

  3. Java 干货之深入理解Java内部类

    可以将一个类定义在另一个类或方法中,这样的类叫做内部类 --<Thinking in Java> 说起内部类,大家并不陌生,并且会经常在实例化容器的时候使用到它.但是内部类的具体细节语法, ...

  4. 深入理解Java内部类

         内部类就是定义在一个类中的另外一个类,是一种从属关系.在没有实际了解内部类之前,我始终困惑,为什么要在一个类中定义另外一个类,这不是增加代码结构复杂度么?现在才大致能知道这种设计的优势是大于 ...

  5. 从反编译深入理解JAVA内部类类结构以及finalkeyword

    1.为什么成员内部类能够无条件訪问外部类的成员? 在此之前,我们已经讨论过了成员内部类能够无条件訪问外部类的成员,那详细到底是怎样实现的呢?以下通过反编译字节码文件看看到底.其实,编译器在进行编译的时 ...

  6. 快速理解Java中的五种单例模式

    解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static S ...

  7. 分享知识-快乐自己:初中级 java 面试题宝典

    1):Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向 ...

  8. 快速理解Java中的五种单例模式(转)

    解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static S ...

  9. 快速理解Java中的七种单例模式

    饿汉式(推荐) package concurencyv2.chapter1; public class SingletonV2 { private static final SingletonV2 i ...

  10. 深入理解Java:内部类

    什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...

随机推荐

  1. Java设计模式透析之 —— 策略(Strategy)

    今天你的leader兴致冲冲地找到你,希望你能够帮他一个小忙.他如今急着要去开会.要帮什么忙呢?你非常好奇. 他对你说.当前你们项目的数据库中有一张用户信息表.里面存放了非常用户的数据.如今须要完毕一 ...

  2. sublime使用技巧(1)-- 下载与插件安装

    一.下载 到官网下载最新的版本 https://www.sublimetext.com/ Sublime官方插件网站 https://packagecontrol.io/ 二.插件安装配置 1.打开S ...

  3. PMD:Java源代码扫描器

    PMD是一个开源代码分析器.可以查找常见编程缺陷,比如未使用的变量.空catch代码块.不必要的对象创建等.支持Java.JavaScript.PLSQL.Apache Velocity.XML.XS ...

  4. 从sql走向linq的我撞死在起点上

    [本文纯个人理解,错误轻喷,非常希望能有大神指点] A left (outer) join B on A.bid=B.id 上面这句话叫做左连接,原因是left(左)join(加入,连入)被译为左连接 ...

  5. phpStorm pycharm编辑器主题修改,自定义颜色

    新的启程 注: 本人小菜鸟一枚,内容也是从其他博客中借鉴的,谨以此作为写博客开端. phpstorm修改主题: 1. phpstorm主题下载 http://www.phpstorm-themes.c ...

  6. 解决Java工程URL路径中含有中文的情况

    问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncod ...

  7. Java语言实现简单FTP软件------>源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  8. Jquery 动态添加option 并给option添加数据,并帮定事件

    //添加下拉框 function append_add(data) { $('#add').append( '<div class="form-group" id='+for ...

  9. Python 面试题(上)

    Python语言特性 1 Python的函数参数传递 看两个例子: a = 1 deffun(a): a = 2 fun(a) printa # 1 a = [] deffun(a): a.appen ...

  10. LeetCode:算法特辑——二分搜索

    LeetCode:算法特辑——二分搜索 算法模板——基础 int L =0; int R =arr.length; while(L<R) { int M = (R-L)/2+L; if(arr[ ...