Java之局部内部类和匿名内部类的区别详解(附源码)

Posted mufeng_慕枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之局部内部类和匿名内部类的区别详解(附源码)相关的知识,希望对你有一定的参考价值。

前言


       前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分;但是他可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。

示例源码


package com.mufeng.thetenthchapter;

interface Counter 
	int next();


public class LocalInnerClass 
	private int count = 0;

	Counter getCounter(final String name) 
		class LocalCounter implements Counter 

			public LocalCounter() 
				// TODO Auto-generated constructor stub
				// Local inner class can have a constructor
				System.out.println("LocalCounter()");
			

			@Override
			public int next() 
				// TODO Auto-generated method stub
				System.out.print(name);
				return count++;
			

		

		return new LocalCounter();
	

	Counter getCounter2(final String name) 
		return new Counter() 
			// Anonymous inner class cannot have named constructor,only an
			// instance initializer
			
				System.out.println("Counter()");
			

			@Override
			public int next() 
				// TODO Auto-generated method stub
				System.out.print(name);
				return count++;
			

		;
	

	public static void main(String[] args) 
		LocalInnerClass lic = new LocalInnerClass();

		Counter c1 = lic.getCounter("Local inner "), 
				c2 = lic.getCounter2("Anonymous inner ");
		for (int i = 0; i < 5; i++) 
			System.out.println(c1.next());
		

		for (int i = 0; i < 5; i++) 
			System.out.println(c2.next());
		
	


输出结果


LocalCounter()
Counter()
Local inner 0
Local inner 1
Local inner 2
Local inner 3
Local inner 4
Anonymous inner 5
Anonymous inner 6
Anonymous inner 7
Anonymous inner 8
Anonymous inner 9

源码解析


       Counter返回的是序列中的下一个值。我们分别使用局部内部类和匿名内部类实现了这个功能,它们具有相同的行为和能力。既然局部内部类的名字在方法外是不可见的,那为什么我们仍然使用局部内部类而不是匿名内部类呢?唯一的理由是,我们需要一个已命名的构造器,或者需要重载构造器,而匿名内部类只能用于实例初始化。        所以使用局部内部类而不使用匿名内部类的另一个理由就是,需要不止一个该内部类的对象。

以上是关于Java之局部内部类和匿名内部类的区别详解(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

Java内部类详解(含:成员内部类局部内部类匿名内部类静态内部类)

Java——基础知识——内部类

JAVA学习之局部内部类,匿名内部类,静态内部类

java基础15 内部类(成员内部类局部内部类)和匿名内部类

内部类和匿名内部类的用法

Java语言中四种内部类(成员内部类,局部内部类,静态内部类,匿名内部类)在实际使用中有啥好处?