gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详细分析Java内部类——局部内部类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

  1. 局部内部类只能在代码代码块、方法体内和作用域中使用。
  2. 局部内部类同样可以无限制调用外部类的方法和属性。
  3. 可以使用abstract修饰,声明为抽象类。

  举个栗子:

?
1
2
3
4
5
6
7
8
9
10
11
public class Outer2 {
   public void print(){
     class Inner2{
       public void test(){
         System.out.println( "Inner.print()" );
       }
     }
     Inner2 inner2 = new Inner2();
     inner2.test();
   }
}
?
1
2
3
4
5
6
public class Test {
   public static void main(String[] args) {
     Outer2 outer2 = new Outer2();
     outer2.print();
   }
}

  这里的Inner2类仅仅在Outer2的print方法中被使用,有效范围也仅在print函数之内.

  通过这段玩具代码,可能无法理解为什么java中要出现这样限制这么多而且挺复杂的东西。让我们来看看之前的栗子:Java中的回调 。

  这里把代码复制过来:

?
1
2
3
4
5
6
7
public class TimePrinter implements ActionListener {
   @Override
   public void actionPerformed(ActionEvent e) {
     Date now = new Date();
     System.out.println( "Time is " + now + " now." );
   }
}
?
1
2
3
4
5
6
7
8
9
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接口的对象,而这个对象仅仅在该方法中使用了一次,这时候内部类的优势就体现出来了,把类封装在方法中,不向外界提供任何冗余信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 局部内部类的资料请关注我其它相关文章! 。

原文链接:https://cloud.tencent.com/developer/article/1016590 。

最后此篇关于详细分析Java内部类——局部内部类的文章就讲到这里了,如果你想了解更多关于详细分析Java内部类——局部内部类的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com