详细分析Java内部类——局部内部类

 更新时间:2020年08月21日 09:06:40   作者:弗兰克的猫  
这篇文章主要介绍了Java局部内部类的相关资料,帮助大家更好的理解和学习Java 内部类的知识,感兴趣的朋友可以了解下

  今天介绍第二种内部类——局部内部类。

  局部内部类是什么?顾名思义,那就是定义在局部内部的类(逃)。开玩笑的,局部内部类就是定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类。局部内部类有以下特性:

  1. 局部内部类只能在代码代码块、方法体内和作用域中使用。
  2. 局部内部类同样可以无限制调用外部类的方法和属性。
  3. 可以使用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内部类——局部内部类的详细内容,更多关于Java 局部内部类的资料请关注脚本之家其它相关文章!

相关文章

  • Java split 分隔空值无法得到的解决方式

    Java split 分隔空值无法得到的解决方式

    这篇文章主要介绍了Java split 分隔空值无法得到的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java中的getClass()以及getName()方法使用

    Java中的getClass()以及getName()方法使用

    这篇文章主要介绍了Java中的getClass()以及getName()方法使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringMVC @GetMapping注解路径冲突问题解决

    SpringMVC @GetMapping注解路径冲突问题解决

    MD5对密码进行加密存储是常见的一种加密方式,本文主要介绍了Java双重MD5加密实现安全登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java中Dom4j的配置与使用示例详解

    Java中Dom4j的配置与使用示例详解

    Dom4j是一个强大的Java库,用于处理XML数据,结合了DOM、SAX、JDOM的优点,它可以解析、生成、修改和序列化XML文档,适用于数据交换、配置文件管理、日志记录、数据持久化和Web服务等场景,Dom4j提供了简单易用的API,便于开发者进行高效的XML操作
    2024-10-10
  • Java CAS原子操作详解

    Java CAS原子操作详解

    在synchronized的优化过程中我们看到大量使用了CAS操作,CAS全称Compare And Set(或Compare And Swap),简单来说CAS操作就是一个虚拟机实现的原子操作
    2023-02-02
  • java UUID&雪花算法生成和使用场景详解

    java UUID&雪花算法生成和使用场景详解

    UUID和雪花算法都是用于生成唯一标识符的有效工具,它们各有优势:UUID简单易用,但长度较长,适用于分布式系统;雪花算法生成的ID较短且有序,适用于需要保证顺序的场景,在选择算法时,需要考虑系统架构、性能需求和顺序需求等因素
    2025-01-01
  • Springboot MongoDB实现自增序列的项目实践

    Springboot MongoDB实现自增序列的项目实践

    在某些特定的业务场景下,会需要使用自增的序列来维护数据,本文主要介绍了Springboot MongoDB实现自增序列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java使用easyExcel实现导入功能

    Java使用easyExcel实现导入功能

    这篇文章介绍了Java使用easyExcel实现导入功能的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java中创建线程的四种方法解析

    Java中创建线程的四种方法解析

    这篇文章主要介绍了Java中创建线程的四种方法解析,线程是Java编程语言中的一个重要概念,它允许程序在同一时间执行多个任务,线程是程序中的执行路径,可以同时执行多个线程,每个线程都有自己的执行流程,需要的朋友可以参考下
    2023-10-10
  • java 学习笔记(入门篇)_java的安装与配置

    java 学习笔记(入门篇)_java的安装与配置

    学习Java已经很长时间了,由于基础不好遇到问题就无从下手,所以,打算写Java的随手笔记来巩固基础,加强学习,接下来讲解java的安装,配置等,感兴趣的朋友可以参考下
    2013-01-01

最新评论