【Java入门提高篇】Day7 Java内部类——局部内部类
今天介绍第二种内部类——局部内部类。
局部内部类是什么?顾名思义,那就是定义在局部内部的类(逃)。开玩笑的,局部内部类就是定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类。局部内部类有以下特性:
- 局部内部类只能在代码代码块、方法体内和作用域中使用。
- 局部内部类同样可以无限制调用外部类的方法和属性。
- 可以使用abstract修饰,声明为抽象类。
举个栗子:
public class Outer2 {
public void print(){
class Inner2{
public void test(){
System.out.println("Inner.print()");
}
}
Inner2 inner2 = new Inner2();
inner2.test();
}
}
public class Test {
public static void main(String[] args) {
Outer2 outer2 = new Outer2();
outer2.print();
}
}
这里的Inner2类仅仅在Outer2的print方法中被使用,有效范围也仅在print函数之内。
通过这段玩具代码,可能无法理解为什么java中要出现这样限制这么多而且挺复杂的东西。让我们来看看之前的栗子:Java中的回调
这里把代码复制过来:
public class TimePrinter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Date now = new Date();
System.out.println("Time is " + now + " now.");
}
}
public class Test {
public static void main(String[] args) {
ActionListener listener = new TimePrinter();
Timer t = new Timer(1000,listener);
t.start();
JOptionPane.showMessageDialog(null,"Quit program?");//弹出对话框,防止主线程结束导致时钟结束
System.exit(0);
}
}
在这里,我们想要创建一个Timer时,需要往里面传入一个实现了ActionListener接口的对象,而这个对象仅仅在该方法中使用了一次,这时候内部类的优势就体现出来了,把类封装在方法中,不向外界提供任何冗余信息:
public class Test {
public static void main(String[] args) {
class InnerTimePrinter implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Date now = new Date();
System.out.println("Time is " + now + " now.");
}
}
ActionListener listener = new InnerTimePrinter();
Timer t = new Timer(1000,listener);
t.start();
JOptionPane.showMessageDialog(null,"Quit?");
System.exit(0);
}
}
你也许会觉得,这样好像只是把类简单的挪到了另一个类里面,并没有什么luan用。
表面上,确实如此,但事实上,还是有很多luan用的。
在《Think in java》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
我们都知道,java中是不能实现多继承的,接口也正是为了对多继承的补充完善给出的方案。而我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
据个人经验,局部内部类确实用的不多,但不常用不代表没有用,知道有这样一个神奇的内部类存在,了解过它的特性之后,可以为你日后的需求提供更多的方案。
至此,本篇讲解完毕,欢迎大家继续关注!
【Java入门提高篇】Day7 Java内部类——局部内部类的更多相关文章
- 【Java入门提高篇】Java集合类详解(一)
今天来看看Java里的一个大家伙,那就是集合. 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体.集合就是用来存放和管理其他类对象 ...
- 【Java入门提高篇】Day8 Java内部类——匿名内部类
今天来看看另一个更加神奇的类--匿名内部类. 就像它的名字表示的那样,这个类是匿名的,用完之后,深藏功与名,就像扫地僧那样默默潜藏于深山之中.匿名内部类不仅没有名字,连class关键字都省掉了,而且匿 ...
- 【Java入门提高篇】Day6 Java内部类——成员内部类
内部类是什么,简单来说,就是定义在类内部的类(一本正经的说着废话). 一个正经的内部类是长这样的: public class Outer { class Inner{ } } 这是为了演示而写的类,没 ...
- 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析
今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...
- 【Java入门提高篇】Day1 抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- 【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解
今天来介绍一下容器类中的另一个哈希表———>LinkedHashMap.这是HashMap的关门弟子,直接继承了HashMap的衣钵,所以拥有HashMap的全部特性,并青出于蓝而胜于蓝,有着一 ...
- 【Java入门提高篇】Day27 Java容器类详解(九)LinkedList详解
这次介绍一下List接口的另一个践行者——LinkedList,这是一位集诸多技能于一身的List接口践行者,可谓十八般武艺,样样精通,栈.队列.双端队列.链表.双向链表都可以用它来模拟,话不多说,赶 ...
- 【Java入门提高篇】Day13 Java中的反射机制
前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上 ...
- 【Java入门提高篇】Day16 Java异常处理(下)
今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势. Exception家族 一图胜千言,先来看一张图. Exception这是一个父类 ...
随机推荐
- 高阶函数实现AOP
AOP(面向切面程序)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日至统计.安全控制.异常处理等.把这些功能抽离出来之后,再通过"动态织入&quo ...
- HTTPS 建立连接的详细过程
HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能.很好的解决了解决了http的三个缺点(被监听.被篡改.被伪装) 对称加密和非对称 ...
- WPF 完美截图 <一>
最近比较懒,一直没继续,此处省略一万字,下面开始正题. 简单介绍下截图的思路: 核心是利用 public CroppedBitmap(BitmapSource source, Int32Rect so ...
- [转载] Redis-benchmark使用总结
转载自http://blog.csdn.net/jiangguilong2000/article/details/24143721 Redis-benchmark为Redis性能测试工具. 指令说明: ...
- [转载] Hadoop MapReduce
转载自http://blog.csdn.net/yfkiss/article/details/6387613和http://blog.csdn.net/yfkiss/article/details/6 ...
- MySQL5.6的optimizer_trace
MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的? MySQL5.6中支持这个功能,optimizer_trace 这个是mysql的参数, ...
- Javaweb学习(一):tomcat服务器配置与启动
目前所使用的集成开发环境为myeclipse10.7,tomcat版本为apache-tomcat-7.0.82,部分编写地方可能有所不同,但是工具不是最主要的,重要的是掌握的知识. tomcat在m ...
- java-基础-泛型
java泛型通配符问题. java中的泛型基本用法参考<java编程思想>第四版 p.353 java泛型中比较难理解的主要是类型擦除和通配符相关. 1.类型擦除 在编译期间,类型 ...
- 自己动手修改Robotium代码(下)
public void takeScreenshot(){ View decorView = viewFetcher.getRecentDecorView(viewFetcher.getWindo ...
- mybatis中sql语句的批量插入
<!-- 收件箱插入收件信息 --> <insert id="insertReceiveemail"> <!-- 生成一条U ...