Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览、成员内部类、局部内部类和匿名内部类。

在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节。

1、局部内部类的概念

   在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。

class OutterClass
{
	void test()
	{
		class InnerClass//局部内部类
		{
		}
	}
}

在上述代码中,InnerClass定义在OutterClass的test方法的内部,因此InnerClass是局部内部类。

2、局部内部类要注意的一个细节

   如果局部内部类访问了一个局部变量,那么该局部变量必须使用final修饰

示例代码:

package com.rk.innerclass;

class OutterClass
{
	void test()
	{
		int i = 100;
		final int x = i;//局部变量

		class InnerClass//局部内部类
		{
			void print()
			{
				System.out.println("test方法中x的值为:" + x);
			}
		}

		InnerClass inner = new InnerClass();
		inner.print();

		System.out.println("i=" + i + ",x=" + x);
	}
}

public class InnerClassLearn
{
	public static void main(String[] args)
	{
		OutterClass outter = new OutterClass();
		outter.test();
	}
}

在上述代码中,OutterClass类的test方法中定义了一个x变量(final int x = 100;),由于在局部内部类InnerClass中需要访问x变量,x变量需要用final修饰。

进一步解释一下,为什么x需要被final进行修饰:

(1)x变量什么时候从内存中消失? test方法执行完毕之后x就会消失。

(2)当test方法执行完毕之后,那么x马上从内存中消失,而InnerClass对象在方法执行完毕的时候还没有从内存中消失,而InnerClass对象的print方法还在访问着x变量,这时候的x变量已经消失了,那么就给人感觉x的生命变量已经被延长了。

换一种更好理解的方式来说,如果OutterClass类的test的方法需要执行5秒钟,而InnerClass类的print方法需要执行10秒钟。在经过5秒之后,①OutterClass类的test方法就要执行完毕了,局部变量x也会从栈内存上消失,而②InnerClass类的print方法还在继续执行中,还需要访问变量x,那么①和②之间就产生了冲突。

解决方案: 如果一个“局部内部类”访问一个“局部变量”的时候,那么就让“该局部内部类”访问“这个局部变量”的复制品。

用myeclipse的1.4版本的Java Compiler进行编译,再用jd.exe(Java Decompiler)进行反编译,得到如下代码:

class OutterClass
{
  class 1$InnerClass//这里将“局部内部类”变成了“成员内部类”
  {
    private final int val$x;//这里定义了一个final修饰的val$x变量
    
    1$InnerClass(int paramInt)//创建了一个带参数的构造方法
    {
      this.val$x = paramInt;
    }
    
    void print()
    {
      System.out.println("test方法中x的值为:" + this.val$x);//这里使用的是自身的val$x变量
    }
  }
  
  void test()
  {
    int i = 100;
    int x = i;

    1.InnerClass inner = new 1.InnerClass(x);//这里调用1.InnerClass类的构造函数
    inner.print();
    
    System.out.println("i=" + i + ",x=" + x);
  }
}

用myeclipse的1.5版本的Java Compiler进行编译,再用jd.exe(Java Decompiler)进行反编译,得到如下代码:

class OutterClass
{
  void test()
  {
    int i = 100;
    final int x = i;
    
    Object inner = new Object()//这里用到了匿名内部类
    {
      void print()
      {
        System.out.println("test方法中x的值为:" + x);
      }
    };
    inner.print();
    
    System.out.println("i=" + i + ",x=" + x);
  }
}

3、思维导图

时间: 2024-08-24 00:29:06

Java内部类:局部内部类(三)的相关文章

java笔记--局部内部类认识与理解

java内部类 内部类应用最多的场景是在编写GUI程序时,将大量的事件监听处理放在了内部类中进行 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3885340.html "谢谢-- 局部内部类: 1.在java中将类定义在方法的内部,成为局部内部类. 2.此类不能使用public.private修饰, 3.其作用域被限定在声明此类的方法中. 4.和其他内部类相比,它具有可以访问方法参数的优点. 5.被局部内部类使用的方法参数必须是

JAVA学习--局部内部类的使用

1 public class TestInnerClass1 { 2 3 } 4 5 class OuterClass{ 6 //局部内部类 7 //如下的使用方式较少 8 public void method1(){ 9 10 class InnnerClass{ 11 12 } 13 } 14 //常常使用一个方法,使其返回值为某个类或接口的对象.而这个类或接口在方法内部创建 15 //使用方式一 16 public Comparable getComparable(){ 17 //1.创建

Java内部类——局部内部类

局部内部类,即放在“{块中}”,局部内部类,不能被成员修饰符static修饰,且内部类的成员也不能是static. 内部类中访问局部变量“{块中}”,需要将局部变量声明为final. 可以直接访问外部类的成员,因为还持有外部类中的引用. 但是不可以访问它所在的块中的变量,只能访问final修饰的局部变量(包括形参). 匿名内部类 前提:内部类必须是继承一个或者实现接口.但是所有的类都有一个共同的基类 Object,所以在用匿名类的时候,也可以不显示的生命一个基类(其实这个基类本身就存在了) 内部

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

前言 前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体里面创建.局部内部类不能有访问说明符,因为它不是外围类的一部分:但是他可以访问当前代码块内的常量,以及此外围类的所有成员.下面的例子对局部内部类与匿名内部类的创建进行了比较. 示例源码 package com.mufeng.thetenthchapter; interface Counter { int next(); } public class LocalInnerClass { private int count = 0;

JAVA-初步认识-第十章-内部类-局部内部类

一. 继续将之前的例子深化一下.现在要讲述的是内部类除了放置在成员上,还能放置在局部上.换句话说,就是哪都能放. 这里局部位置是指哪儿? 继续将程序补全,截图如下: 上面的截图其实交代了内部类在局部位置上的知识点,这里面有一定的规则. 截图中有两个位置创建内部类的对象,有一个没写完,只写了In,但是也交代了创建对象的位置.没写完的那个位置,书写内部类对象是没有问题的,访问内部类是没有问题的,因为它们处在同一层次上,可以"看到"内部类.但是func()和method()处在同一层次上,f

Java中成员变量、局部变量、局部内部类、局部内部类方法作用域问题。

public class A { String s = "outer class member variable"; //成员变量 public void Method() { //成员方法 final String s1 = "inner class variable"; //局部变量 class InnerClass { //局部内部类 public void innerMethod() { //局部内部类方法 int test = 20; System.out

Java学习笔记23---内部类之局部内部类只能访问final的局部变量

局部内部类是定义在方法体或代码块中的类,在笔记19中已有过简单介绍. 今天要讨论的是局部内部类为什么只能访问为常量的局部变量. 作者: 博客园--蝉蝉 请尊重作者劳动成果,转载请在标题注明"转载"字样,并标明原文链接: http://www.cnblogs.com/chanchan/p/8402411.html 参考资料: http://www.cnblogs.com/dolphin0520/p/3811445.html 1.首先来了解一下局部内部类是如何访问局部变量的 Person类

Java学习(十六)、成员内部类,静态内部类,匿名内部类,局部内部类

定义:将一个类定义在另一个类的内部.内部的类称为内部类; public class Outer{ class inner{ //省略 } } 特点: ①   内部类可以很好的实现隐藏,可以使用protected,private修饰符; ②   内部类可以直接访问外部类的所有成员,包括私有成员; ③   外部类不能直接访问内部类的成员,必须首先要建立内部类的对象才能访问; ④   内部类可以解决一些问题,比如间接的去实现多继承.可以避免修改接口而实现同一个类中两种同名方法的调用; 成员内部类及应用

那些java中的内部类

java内部类是从JDK1.1开始出现的,因此,很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下.所以,这里将从四个方面做一个简单的总结: 一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来简单了解一下这四种内部类的用法. 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类的内部

Java中的内部类怎么用

一.为什么需要内部类?java内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这 样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力. 真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++