【JAVA】的内部类详解

转载博客: https://www.cnblogs.com/dolphin0520/p/3811445.html
作者:海 子

  说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。下面是本文的目录大纲:

  一.内部类基础

  二.深入理解内部类

  三.内部类的使用场景和好处

  四.常见的与内部类相关的笔试面试题

  若有不正之处,请多谅解并欢迎批评指正。

  请尊重作者劳动成果,转载请标明原文链接:

  http://www.cnblogs.com/dolphin0520/p/3811445.html

一.内部类基础

  在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。

  1.成员内部类

  成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class Circle {
     double radius = 0 ;
     
     public Circle( double radius) {
         this .radius = radius;
     }
     
     class Draw {     //内部类
         public void drawSahpe() {
             System.out.println( "drawshape" );
         }
     }
}

  这样看起来,类Draw像是类Circle的一个成员,Circle称为外部类。成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Circle {
     private double radius = 0 ;
     public static int count = 1 ;
     public Circle( double radius) {
         this .radius = radius;
     }
     
     class Draw {     //内部类
         public void drawSahpe() {
             System.out.println(radius);  //外部类的private成员
             System.out.println(count);   //外部类的静态成员
         }
     }
}

  不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

?
1
2
外部类. this .成员变量
外部类. this .成员方法

  虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Circle {
     private double radius = 0 ;
 
     public Circle( double radius) {
         this .radius = radius;
         getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问
     }
     
     private Draw getDrawInstance() {
         return new Draw();
     }
     
     class Draw {     //内部类
         public void drawSahpe() {
             System.out.println(radius);  //外部类的private成员
         }
     }
}

  成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。创建成员内部类对象的一般方式如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Test {
     public static void main(String[] args)  {
         //第一种方式:
         Outter outter = new Outter();
         Outter.Inner inner = outter. new Inner();  //必须通过Outter对象来创建
         
         //第二种方式:
         Outter.Inner inner1 = outter.getInnerInstance();
     }
}
 
class Outter {
     private Inner inner = null ;
     public Outter() {
         
     }
     
     public Inner getInnerInstance() {
         if (inner == null )
             inner = new Inner();
         return inner;
     }
      
     class Inner {
         public Inner() {
             
         }
     }
}

  内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上面的例子,如果成员内部类Inner用private修饰,则只能在外部类的内部访问,如果用public修饰,则任何地方都能访问;如果用protected修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。这一点和外部类有一点不一样,外部类只能被public和包访问两种权限修饰。我个人是这么理解的,由于成员内部类看起来像是外部类的一个成员,所以可以像类的成员一样拥有多种权限修饰。

  2.局部内部类

  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class People{
     public People() {
         
     }
}
 
class Man{
     public Man(){
         
     }
     
     public People getWoman(){
         class Woman extends People{   //局部内部类
             int age = 0 ;
         }
         return new Woman();
     }
}

  注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

  3.匿名内部类

  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名内部类不但方便,而且使代码更加容易维护。下面这段代码是一段Android事件监听代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
scan_bt.setOnClickListener( new OnClickListener() {
             
             @Override
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 
             }
         });
         
         history_bt.setOnClickListener( new OnClickListener() {
             
             @Override
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 
             }
         });

  这段代码为两个按钮设置监听器,这里面就使用了匿名内部类。这段代码中的:

?
1
2
3
4
5
6
7
8
new OnClickListener() {
             
             @Override
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 
             }
         }

  就是匿名内部类的使用。代码中需要给按钮设置监听器对象,使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。当然像下面这种写法也是可以的,跟上面使用匿名内部类达到效果相同。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void setListener()
{
     scan_bt.setOnClickListener( new Listener1());       
     history_bt.setOnClickListener( new Listener2());
}
 
class Listener1 implements View.OnClickListener{
     @Override
     public void onClick(View v) {
     // TODO Auto-generated method stub
             
     }
}
 
class Listener2 implements View.OnClickListener{
     @Override
     public void onClick(View v) {
     // TODO Auto-generated method stub
             
     }
}

  这种写法虽然能达到一样的效果,但是既冗长又难以维护,所以一般使用匿名内部类的方法来编写事件监听代码。同样的,匿名内部类也是不能有访问修饰符和static修饰符的。

  匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

  4.静态内部类

  静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
     public static void main(String[] args)  {
         Outter.Inner inner = new Outter.Inner();
     }
}
 
class Outter {
     public Outter() {
         
     }
     
     static class Inner {
         public Inner() {
             
         }
     }
}

  

二.深入理解内部类

  1.为什么成员内部类可以无条件访问外部类的成员?

  在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟。事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面是Outter.java的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Outter {
     private Inner inner = null ;
     public Outter() {
         
     }
     
     public Inner getInnerInstance() {
         if (inner == null )
             inner = new Inner();
         return inner;
     }
      
     protected class Inner {
         public Inner() {
             
         }
     }
}

  编译之后,出现了两个字节码文件:

  反编译Outter$Inner.class文件得到下面信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
E:\Workspace\Test\bin\com\cxh\test2>javap -v Outter$Inner
Compiled from "Outter.java"
public class com.cxh.test2.Outter$Inner extends java.lang.Object
   SourceFile: "Outter.java"
   InnerClass:
    # 24 = # 1 of # 22 ; //Inner=class com/cxh/test2/Outter$Inner of class com/cxh/tes
t2/Outter
   minor version: 0
   major version: 50
   Constant pool:
const # 1 = class        # 2 ;     //  com/cxh/test2/Outter$Inner
const # 2 = Asciz        com/cxh/test2/Outter$Inner;
const # 3 = class        # 4 ;     //  java/lang/Object
const # 4 = Asciz        java/lang/Object;
const # 5 = Asciz        this $ 0 ;
const # 6 = Asciz        Lcom/cxh/test2/Outter;;
const # 7 = Asciz        <init>;
const # 8 = Asciz        (Lcom/cxh/test2/Outter;)V;
const # 9 = Asciz        Code;
const # 10 = Field       # 1 .# 11 ; //  com/cxh/test2/Outter$Inner.this$0:Lcom/cxh/t
est2/Outter;
const # 11 = NameAndType # 5 :# 6 ; //  this$0:Lcom/cxh/test2/Outter;
const # 12 = Method      # 3 .# 13 ; //  java/lang/Object."<init>":()V
const # 13 = NameAndType # 7 :# 14 ; //  "<init>":()V
const # 14 = Asciz       ()V;
const # 15 = Asciz       LineNumberTable;
const # 16 = Asciz       LocalVariableTable;
const # 17 = Asciz       this ;
const # 18 = Asciz       Lcom/cxh/test2/Outter$Inner;;
const # 19 = Asciz       SourceFile;
const # 20 = Asciz       Outter.java;
const # 21 = Asciz       InnerClasses;
const # 22 = class       # 23 ;    //  com/cxh/test2/Outter
const # 23 = Asciz       com/cxh/test2/Outter;
const # 24 = Asciz       Inner;
 
{
final com.cxh.test2.Outter this $ 0 ;
 
public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);
   Code:
    Stack= 2 , Locals= 2 , Args_size= 2
    0 :   aload_0
    1 :   aload_1
    2 :   putfield        # 10 ; //Field this$0:Lcom/cxh/test2/Outter;
    5 :   aload_0
    6 :   invokespecial   # 12 ; //Method java/lang/Object."<init>":()V
    9 :   return
   LineNumberTable:
    line 16 : 0
    line 18 : 9
 
   LocalVariableTable:
    Start  Length  Slot  Name   Signature
    0      10      0    this       Lcom/cxh/test2/Outter$Inner;
 
 
}

  第11行到35行是常量池的内容,下面逐一第38行的内容:

final com.cxh.test2.Outter this$0;

  这行是一个指向外部类对象的指针,看到这里想必大家豁然开朗了。也就是说编译器会默认为成员内部类添加了一个指向外部类对象的引用,那么这个引用是如何赋初值的呢?下面接着看内部类的构造器:

public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);

  从这里可以看出,虽然我们在定义的内部类的构造器是无参构造器,编译器还是会默认添加一个参数,该参数的类型为指向外部类对象的一个引用,所以成员内部类中的Outter this&0 指针便指向了外部类对象,因此可以在成员内部类中随意访问外部类的成员。从这里也间接说明了成员内部类是依赖于外部类的,如果没有创建外部类的对象,则无法对Outter this&0引用进行初始化赋值,也就无法创建成员内部类的对象了。

  2.为什么局部内部类和匿名内部类只能访问局部final变量?

  想必这个问题也曾经困扰过很多人,在讨论这个问题之前,先看下面这段代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
     public static void main(String[] args)  {
         
     }
     
     public void test( final int b) {
         final int a = 10 ;
         new Thread(){
             public void run() {
                 System.out.println(a);
                 System.out.println(b);
             };
         }.start();
     }
}

  这段代码会被编译成两个class文件:Test.class和Test1.classOutter1.class。默认情况下,编译器会为匿名内部类和局部内部类起名为Outterx.class(x为正整数)。

  

  根据上图可知,test方法中的匿名内部类的名字被起为 Test$1。

  上段代码中,如果把变量a和b前面的任一个final去掉,这段代码都编译不过。我们先考虑这样一个问题:

  当test方法执行完毕之后,变量a的生命周期就结束了,而此时Thread对象的生命周期很可能还没有结束,那么在Thread的run方法中继续访问变量a就变成不可能了,但是又要实现这样的效果,怎么办呢?Java采用了 复制  的手段来解决这个问题。将这段代码的字节码反编译可以得到下面的内容:

  我们看到在run方法中有一条指令:

bipush 10

  这条指令表示将操作数10压栈,表示使用的是一个本地局部变量。这个过程是在编译期间由编译器默认进行,如果这个变量的值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法中的局部变量完全独立开。

  下面再看一个例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
     public static void main(String[] args)  {
         
     }
     
     public void test( final int a) {
         new Thread(){
             public void run() {
                 System.out.println(a);
             };
         }.start();
     }
}

  反编译得到:

  我们看到匿名内部类Test$1的构造器含有两个参数,一个是指向外部类对象的引用,一个是int型变量,很显然,这里是将变量test方法中的形参a以参数的形式传进来对匿名内部类中的拷贝(变量a的拷贝)进行赋值初始化。

  也就说如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。

  从上面可以看出,在run方法中访问的变量a根本就不是test方法中的局部变量a。这样一来就解决了前面所说的 生命周期不一致的问题。但是新的问题又来了,既然在run方法中访问的变量a和test方法中的变量a不是同一个变量,当在run方法中改变变量a的值的话,会出现什么情况?

  对,会造成数据不一致性,这样就达不到原本的意图和要求。为了解决这个问题,java编译器就限定必须将变量a限制为final变量,不允许对变量a进行更改(对于引用类型的变量,是不允许指向新的对象),这样数据不一致性的问题就得以解决了。

  到这里,想必大家应该清楚为何 方法中的局部变量和形参都必须用final进行限定了。

  3.静态内部类有特殊的地方吗?

  从前面可以知道,静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的,这个读者可以自己尝试反编译class文件看一下就知道了,是没有Outter this&0引用的。

三.内部类的使用场景和好处

  为什么在Java中需要内部类?总结一下主要有以下四点:

  1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

  2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

  3.方便编写事件驱动程序

  4.方便编写线程代码

  个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。

四.常见的与内部类相关的笔试面试题

 1.根据注释填写(1),(2),(3)处的代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test{
     public static void main(String[] args){
            // 初始化Bean1
            ( 1 )
            bean1.I++;
            // 初始化Bean2
            ( 2 )
            bean2.J++;
            //初始化Bean3
            ( 3 )
            bean3.k++;
     }
     class Bean1{
            public int I = 0 ;
     }
 
     static class Bean2{
            public int J = 0 ;
     }
}
 
class Bean{
     class Bean3{
            public int k = 0 ;
     }
}

  从前面可知,对于成员内部类,必须先产生外部类的实例化对象,才能产生内部类的实例化对象。而静态内部类不用产生外部类的实例化对象即可产生内部类的实例化对象。

  创建静态内部类对象的一般形式为:  外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

  创建成员内部类对象的一般形式为:  外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

  因此,(1),(2),(3)处的代码分别为:

Test test = new Test();    

Test.Bean1 bean1 = test.new Bean1();

View Code
Test.Bean2 b2 = new Test.Bean2();    
View Code
Bean bean = new Bean();     

Bean.Bean3 bean3 = bean.new Bean3();

View Code

2.下面这段代码的输出结果是什么?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test {
     public static void main(String[] args)  {
         Outter outter = new Outter();
         outter. new Inner().print();
     }
}
 
 
class Outter
{
     private int a = 1 ;
     class Inner {
         private int a = 2 ;
         public void print() {
             int a = 3 ;
             System.out.println( "局部变量:" + a);
             System.out.println( "内部类变量:" + this .a);
             System.out.println( "外部类变量:" + Outter. this .a);
         }
     }
}
3
2
1
View Code

  最后补充一点知识:关于成员内部类的继承问题。一般来说,内部类是很少用来作为继承用的。但是当用来继承的话,要注意两点:

  1)成员内部类的引用方式必须为 Outter.Inner.

  2)构造器中必须有指向外部类对象的引用,并通过这个引用调用super()。这段代码摘自《Java编程思想》

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class WithInner {
     class Inner{
         
     }
}
class InheritInner extends WithInner.Inner {
      
     // InheritInner() 是不能通过编译的,一定要加上形参
     InheritInner(WithInner wi) {
         wi. super (); //必须有这句调用
     }
  
     public static void main(String[] args) {
         WithInner wi = new WithInner();
         InheritInner obj = new InheritInner(wi);
     }
}

 参考资料:

  《java编程思想》

  http://www.cnblogs.com/chenssy/p/3388487.html

  http://blog.csdn.net/zhangjg_blog/article/details/20000769

  http://blog.csdn.net/zhangjg_blog/article/details/19996629

  http://blog.csdn.net/zhaoqianjava/article/details/6849812

  http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

 

作者: 海子
         
本博客中未标明转载的文章归作者 海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: Java基础
标签: Java
138
1
« 上一篇: 那些年震撼我们心灵的音乐
» 下一篇: 浅析Java中的final关键字
	</div>
	<div class="postDesc">posted @ <span id="post-date">2014-07-02 20:26</span> <a href="https://www.cnblogs.com/dolphin0520/">海 子</a> 阅读(<span id="post_view_count">188919</span>) 评论(<span id="post_comment_count">48</span>)  <a href="https://i.cnblogs.com/EditPosts.aspx?postid=3811445" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(3811445);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=86633,cb_entryId=3811445,cb_blogApp=currentBlogApp,cb_blogUserGuid='ab3961d0-cd5d-e011-a53f-842b2b196315',cb_entryCreatedDate='2014/7/2 20:26:00';loadViewCount(cb_entryId);var cb_postType=1;</script>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#2976076" class="layer">#1楼</a><a name="2976076" id="comment_anchor_2976076"></a>  <span class="comment_date">2014-07-02 21:20</span> <a id="a_comment_author_2976076" href="https://www.cnblogs.com/neverstop/" target="_blank">眼神与背影</a> <a href="http://msg.cnblogs.com/send/%E7%9C%BC%E7%A5%9E%E4%B8%8E%E8%83%8C%E5%BD%B1" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_2976076" class="blog_comment_body">写的很详细,支持一下</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2976076,'Digg',this)">支持(6)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2976076,'Bury',this)">反对(0)</a></div><span id="comment_2976076_avatar" style="display:none;">http://pic.cnblogs.com/face/u206282.jpg?id=05164547</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#2978153" class="layer">#2楼</a><a name="2978153" id="comment_anchor_2978153"></a>  <span class="comment_date">2014-07-06 13:17</span> <a id="a_comment_author_2978153" href="https://www.cnblogs.com/codezyc/" target="_blank">codezyc</a> <a href="http://msg.cnblogs.com/send/codezyc" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_2978153" class="blog_comment_body">好文,多谢分享</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2978153,'Digg',this)">支持(5)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2978153,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3083989" class="layer">#3楼</a><a name="3083989" id="comment_anchor_3083989"></a>  <span class="comment_date">2014-12-11 18:15</span> <a id="a_comment_author_3083989" href="https://www.cnblogs.com/shijian95/" target="_blank">大波罗</a> <a href="http://msg.cnblogs.com/send/%E5%A4%A7%E6%B3%A2%E7%BD%97" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3083989" class="blog_comment_body">相当不错,解释的很详细!一看就知道博主确实是用心研究了。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3083989,'Digg',this)">支持(4)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3083989,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3107232" class="layer">#4楼</a><a name="3107232" id="comment_anchor_3107232"></a>  <span class="comment_date">2015-01-15 10:17</span> <a id="a_comment_author_3107232" href="https://www.cnblogs.com/aeolia/" target="_blank">Aeolia</a> <a href="http://msg.cnblogs.com/send/Aeolia" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3107232" class="blog_comment_body">谢谢楼主</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3107232,'Digg',this)">支持(2)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3107232,'Bury',this)">反对(0)</a></div><span id="comment_3107232_avatar" style="display:none;">http://pic.cnblogs.com/face/494565/20130302212733.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3127609" class="layer">#5楼</a><a name="3127609" id="comment_anchor_3127609"></a>  <span class="comment_date">2015-02-11 11:19</span> <a id="a_comment_author_3127609" href="https://www.cnblogs.com/dengkj/" target="_blank">dengkj</a> <a href="http://msg.cnblogs.com/send/dengkj" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3127609" class="blog_comment_body">楼主从根本上解决了问题,并不是只讲了一个结论,功力深厚啊!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3127609,'Digg',this)">支持(8)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3127609,'Bury',this)">反对(0)</a></div><span id="comment_3127609_avatar" style="display:none;">http://pic.cnblogs.com/face/473070/20180131140022.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3157570" class="layer">#6楼</a><a name="3157570" id="comment_anchor_3157570"></a>  <span class="comment_date">2015-04-07 17:35</span> <a id="a_comment_author_3157570" href="http://home.cnblogs.com/u/741305/" target="_blank">chows_cnblogs</a> <a href="http://msg.cnblogs.com/send/chows_cnblogs" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3157570" class="blog_comment_body">楼主说的很详细,醍醐灌顶</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3157570,'Digg',this)">支持(2)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3157570,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3160934" class="layer">#7楼</a><a name="3160934" id="comment_anchor_3160934"></a>  <span class="comment_date">2015-04-12 16:04</span> <a id="a_comment_author_3160934" href="https://www.cnblogs.com/guojianjavaweb/" target="_blank">guojianjavaweb</a> <a href="http://msg.cnblogs.com/send/guojianjavaweb" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3160934" class="blog_comment_body">好东西!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3160934,'Digg',this)">支持(1)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3160934,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3196330" class="layer">#8楼</a><a name="3196330" id="comment_anchor_3196330"></a>  <span class="comment_date">2015-05-29 16:52</span> <a id="a_comment_author_3196330" href="https://www.cnblogs.com/hnxiaowei/" target="_blank">小威1993</a> <a href="http://msg.cnblogs.com/send/%E5%B0%8F%E5%A8%811993" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3196330" class="blog_comment_body">很好!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3196330,'Digg',this)">支持(1)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3196330,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3209048" class="layer">#9楼</a><a name="3209048" id="comment_anchor_3209048"></a>  <span class="comment_date">2015-06-15 21:20</span> <a id="a_comment_author_3209048" href="https://www.cnblogs.com/boothsun/" target="_blank">做个有梦想的咸鱼</a> <a href="http://msg.cnblogs.com/send/%E5%81%9A%E4%B8%AA%E6%9C%89%E6%A2%A6%E6%83%B3%E7%9A%84%E5%92%B8%E9%B1%BC" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3209048" class="blog_comment_body">写着真好,太帅了~</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3209048,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3209048,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3219355" class="layer">#10楼</a><a name="3219355" id="comment_anchor_3219355"></a>  <span class="comment_date">2015-07-01 17:41</span> <a id="a_comment_author_3219355" href="https://www.cnblogs.com/xiaoxiaoxin-love-ping/" target="_blank">小小鑫</a> <a href="http://msg.cnblogs.com/send/%E5%B0%8F%E5%B0%8F%E9%91%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3219355" class="blog_comment_body">百度一百篇 顶不上您的一篇!<br>真心赞</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3219355,'Digg',this)">支持(1)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3219355,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3222012" class="layer">#11楼</a><a name="3222012" id="comment_anchor_3222012"></a>  <span class="comment_date">2015-07-05 21:28</span> <a id="a_comment_author_3222012" href="https://www.cnblogs.com/chidou-yin/" target="_blank">赤豆元宵</a> <a href="http://msg.cnblogs.com/send/%E8%B5%A4%E8%B1%86%E5%85%83%E5%AE%B5" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3222012" class="blog_comment_body">好文章,讲的很透彻,原理也进行了分析,谢谢楼主</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3222012,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3222012,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3229203" class="layer">#12楼</a><a name="3229203" id="comment_anchor_3229203"></a>  <span class="comment_date">2015-07-16 18:00</span> <a id="a_comment_author_3229203" href="https://www.cnblogs.com/xdlwd086/" target="_blank">文轩云阁</a> <a href="http://msg.cnblogs.com/send/%E6%96%87%E8%BD%A9%E4%BA%91%E9%98%81" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3229203" class="blog_comment_body">楼主分析的非常到位,多谢分享</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3229203,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3229203,'Bury',this)">反对(0)</a></div><span id="comment_3229203_avatar" style="display:none;">http://pic.cnblogs.com/face/672259/20140913191341.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3231437" class="layer">#13楼</a><a name="3231437" id="comment_anchor_3231437"></a>  <span class="comment_date">2015-07-20 15:24</span> <a id="a_comment_author_3231437" href="http://home.cnblogs.com/u/722508/" target="_blank">sunshine小北</a> <a href="http://msg.cnblogs.com/send/sunshine%E5%B0%8F%E5%8C%97" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3231437" class="blog_comment_body">谢谢!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3231437,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3231437,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3236699" class="layer">#14楼</a><a name="3236699" id="comment_anchor_3236699"></a>  <span class="comment_date">2015-07-28 11:01</span> <a id="a_comment_author_3236699" href="http://home.cnblogs.com/u/787798/" target="_blank">裸奔的太阳</a> <a href="http://msg.cnblogs.com/send/%E8%A3%B8%E5%A5%94%E7%9A%84%E5%A4%AA%E9%98%B3" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3236699" class="blog_comment_body">讲的思路, 结构很清晰。  谢谢。 。。。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3236699,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3236699,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3238240" class="layer">#15楼</a><a name="3238240" id="comment_anchor_3238240"></a>  <span class="comment_date">2015-07-30 15:28</span> <a id="a_comment_author_3238240" href="http://home.cnblogs.com/u/792202/" target="_blank">雨落叶泣</a> <a href="http://msg.cnblogs.com/send/%E9%9B%A8%E8%90%BD%E5%8F%B6%E6%B3%A3" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3238240" class="blog_comment_body">牛掰</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3238240,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3238240,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3259417" class="layer">#16楼</a><a name="3259417" id="comment_anchor_3259417"></a>  <span class="comment_date">2015-09-03 10:53</span> <a id="a_comment_author_3259417" href="https://www.cnblogs.com/lingdubingchuan/" target="_blank">零度冰川</a> <a href="http://msg.cnblogs.com/send/%E9%9B%B6%E5%BA%A6%E5%86%B0%E5%B7%9D" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3259417" class="blog_comment_body">写的真不错,思路真清楚</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3259417,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3259417,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3259426" class="layer">#17楼</a><a name="3259426" id="comment_anchor_3259426"></a>  <span class="comment_date">2015-09-03 11:42</span> <a id="a_comment_author_3259426" href="https://www.cnblogs.com/lingdubingchuan/" target="_blank">零度冰川</a> <a href="http://msg.cnblogs.com/send/%E9%9B%B6%E5%BA%A6%E5%86%B0%E5%B7%9D" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3259426" class="blog_comment_body">请教楼主个问题,上面说的都是从内部类去访问外部类的方式,那外部类如何访问内部类呢?书上写外部类实例化内部类后,对于外部类来说内部类的整个结构都是透明的,那就是相当于内部类成员对于外部类都是暴漏的,这个是怎么做到的?</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3259426,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3259426,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3260059" class="layer">#18楼</a><a name="3260059" id="comment_anchor_3260059"></a>  <span class="comment_date">2015-09-05 09:00</span> <a id="a_comment_author_3260059" href="https://www.cnblogs.com/wdfrog/" target="_blank">遗忘海岸</a> <a href="http://msg.cnblogs.com/send/%E9%81%97%E5%BF%98%E6%B5%B7%E5%B2%B8" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3260059" class="blog_comment_body">好文,收藏了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3260059,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3260059,'Bury',this)">反对(0)</a></div><span id="comment_3260059_avatar" style="display:none;">http://pic.cnblogs.com/face/u24437.jpg</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3260954" class="layer">#19楼</a><a name="3260954" id="comment_anchor_3260954"></a>  <span class="comment_date">2015-09-06 16:55</span> <a id="a_comment_author_3260954" href="http://home.cnblogs.com/u/722922/" target="_blank">FrankieY</a> <a href="http://msg.cnblogs.com/send/FrankieY" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3260954" class="blog_comment_body">javap -v Outter$Inner   这个命令编译出的代码看不懂啊 555</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3260954,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3260954,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3299964" class="layer">#20楼</a><a name="3299964" id="comment_anchor_3299964"></a>  <span class="comment_date">2015-11-05 19:26</span> <a id="a_comment_author_3299964" href="https://www.cnblogs.com/siiruo/" target="_blank">siiruo</a> <a href="http://msg.cnblogs.com/send/siiruo" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3299964" class="blog_comment_body">如果在eclipse中直接执行下述代码,没有任何错误啊!<br>public class Test {<br>	<br>	public static void main(String[] args)  {<br>		new Test().test(8);<br>          <br>	}<br>/**<br> * a和b不用final修饰也能运行啊<br> * @param b<br> */<br>	public void test( int b) {<br>           int a = 10;<br>          new Thread(){<br>           public void run() {<br>               System.out.println(a);<br>               System.out.println(b);<br>           };<br>           }.start();<br>   }<br>	<br>}<br>输出结果:<br>10<br>8</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3299964,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3299964,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3325290" class="layer">#21楼</a><a name="3325290" id="comment_anchor_3325290"></a>  <span class="comment_date">2015-12-11 16:36</span> <a id="a_comment_author_3325290" href="http://home.cnblogs.com/u/855667/" target="_blank">飞翔的风</a> <a href="http://msg.cnblogs.com/send/%E9%A3%9E%E7%BF%94%E7%9A%84%E9%A3%8E" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3325290" class="blog_comment_body">2.为什么局部内部类和匿名内部类只能访问局部final变量?<br>我看到楼主有这么一句解释:<br>这条指令表示将操作数10压栈,表示使用的是一个本地局部变量。这个过程是在编译期间由编译器默认进行,如果这个变量的值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。<br>==》“这个过程是在编译期间由编译器默认进行,如果这个变量的值在编译期间可以确定,则编译器默认会在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中”,<br>==》实事证明,如果这个变量在运行期间才确定的,程序也不会报错,也会正常运行。<br>即将你上面的代码改下:<br>final int a=getA(); <br>并在外部中添加方法<br>static int getA(){return 10;}</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3325290,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3325290,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3349380" class="layer">#22楼</a><a name="3349380" id="comment_anchor_3349380"></a>  <span class="comment_date">2016-01-18 11:24</span> <a id="a_comment_author_3349380" href="https://www.cnblogs.com/starskys/" target="_blank">迷路的猫</a> <a href="http://msg.cnblogs.com/send/%E8%BF%B7%E8%B7%AF%E7%9A%84%E7%8C%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3349380" class="blog_comment_body"><a href="#3299964" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3299964);">@</a>

siiruo
你是不是用的JAVA8?



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3369624" class="layer">#23楼</a><a name="3369624" id="comment_anchor_3369624"></a>  <span class="comment_date">2016-03-01 18:57</span> <a id="a_comment_author_3369624" href="http://home.cnblogs.com/u/871277/" target="_blank">放纵的卡尔</a> <a href="http://msg.cnblogs.com/send/%E6%94%BE%E7%BA%B5%E7%9A%84%E5%8D%A1%E5%B0%94" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3369624" class="blog_comment_body">特地来感谢下!谢谢分享这么好的知识!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3369624,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3369624,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3369626" class="layer">#24楼</a><a name="3369626" id="comment_anchor_3369626"></a>  <span class="comment_date">2016-03-01 18:58</span> <a id="a_comment_author_3369626" href="http://home.cnblogs.com/u/871277/" target="_blank">放纵的卡尔</a> <a href="http://msg.cnblogs.com/send/%E6%94%BE%E7%BA%B5%E7%9A%84%E5%8D%A1%E5%B0%94" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3369626" class="blog_comment_body"><a href="#3325290" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3325290);">@</a>

飞翔的风
听说jdk8.0 final的限制已经去掉了。



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3389740" class="layer">#25楼</a><a name="3389740" id="comment_anchor_3389740"></a>  <span class="comment_date">2016-03-23 19:27</span> <a id="a_comment_author_3389740" href="https://www.cnblogs.com/xiaojintao/" target="_blank">JintaoXIAO</a> <a href="http://msg.cnblogs.com/send/JintaoXIAO" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3389740" class="blog_comment_body">学习了,java8 已经 解决 内部类使用外部局部变量,外部局部变量必须声明为final的限制了,楼主能再介绍一下jdk8中这个地方的实现原理吗?</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3389740,'Digg',this)">支持(2)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3389740,'Bury',this)">反对(1)</a></div><span id="comment_3389740_avatar" style="display:none;">http://pic.cnblogs.com/face/580256/20140110130749.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3392517" class="layer">#26楼</a><a name="3392517" id="comment_anchor_3392517"></a>  <span class="comment_date">2016-03-26 16:10</span> <a id="a_comment_author_3392517" href="http://home.cnblogs.com/u/922340/" target="_blank">一念之间0</a> <a href="http://msg.cnblogs.com/send/%E4%B8%80%E5%BF%B5%E4%B9%8B%E9%97%B40" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3392517" class="blog_comment_body">很不错哦<br>  讲得很详细<br>     是否可以讲一下,静态与非静态原理呢?</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3392517,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3392517,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3428031" class="layer">#27楼</a><a name="3428031" id="comment_anchor_3428031"></a>  <span class="comment_date">2016-05-10 21:16</span> <a id="a_comment_author_3428031" href="https://www.cnblogs.com/qq29oo/" target="_blank">qq29oo</a> <a href="http://msg.cnblogs.com/send/qq29oo" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3428031" class="blog_comment_body">谢谢,学习到了学习到了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3428031,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3428031,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3440199" class="layer">#28楼</a><a name="3440199" id="comment_anchor_3440199"></a>  <span class="comment_date">2016-05-27 09:18</span> <a id="a_comment_author_3440199" href="https://www.cnblogs.com/meizhouxiang/" target="_blank">美洲象</a> <a href="http://msg.cnblogs.com/send/%E7%BE%8E%E6%B4%B2%E8%B1%A1" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3440199" class="blog_comment_body">好文!!!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3440199,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3440199,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3445392" class="layer">#29楼</a><a name="3445392" id="comment_anchor_3445392"></a>  <span class="comment_date">2016-06-03 16:04</span> <a id="a_comment_author_3445392" href="https://www.cnblogs.com/jlxuqiang/" target="_blank">jlxuqiang</a> <a href="http://msg.cnblogs.com/send/jlxuqiang" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3445392" class="blog_comment_body">真心赞<br>真心赞<br>真心赞</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3445392,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3445392,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3475561" class="layer">#30楼</a><a name="3475561" id="comment_anchor_3475561"></a>  <span class="comment_date">2016-07-24 10:36</span> <a id="a_comment_author_3475561" href="https://www.cnblogs.com/wangjiesheng/" target="_blank">下一站你要去哪里</a> <a href="http://msg.cnblogs.com/send/%E4%B8%8B%E4%B8%80%E7%AB%99%E4%BD%A0%E8%A6%81%E5%8E%BB%E5%93%AA%E9%87%8C" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3475561" class="blog_comment_body">很详细,不错。不过那个方法内部类只能访问final修饰的成员变量,这个还有些模糊</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3475561,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3475561,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3532808" class="layer">#31楼</a><a name="3532808" id="comment_anchor_3532808"></a>  <span class="comment_date">2016-10-15 20:07</span> <a id="a_comment_author_3532808" href="https://www.cnblogs.com/rosending/" target="_blank">RosenDing</a> <a href="http://msg.cnblogs.com/send/RosenDing" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3532808" class="blog_comment_body">很不错,好文,讲的很详细,赞!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3532808,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3532808,'Bury',this)">反对(0)</a></div><span id="comment_3532808_avatar" style="display:none;">http://pic.cnblogs.com/face/829194/20160731102403.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3581243" class="layer">#32楼</a><a name="3581243" id="comment_anchor_3581243"></a>  <span class="comment_date">2016-12-15 10:15</span> <a id="a_comment_author_3581243" href="https://www.cnblogs.com/wuyouwei/" target="_blank">有为吴</a> <a href="http://msg.cnblogs.com/send/%E6%9C%89%E4%B8%BA%E5%90%B4" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3581243" class="blog_comment_body">@海 子 有个地方有错误。。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3581243,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3581243,'Bury',this)">反对(0)</a></div><span id="comment_3581243_avatar" style="display:none;">http://pic.cnblogs.com/face/891968/20160204145343.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3582040" class="layer">#33楼</a><a name="3582040" id="comment_anchor_3582040"></a>  <span class="comment_date">2016-12-15 21:11</span> <a id="a_comment_author_3582040" href="https://www.cnblogs.com/wuyouwei/" target="_blank">有为吴</a> <a href="http://msg.cnblogs.com/send/%E6%9C%89%E4%B8%BA%E5%90%B4" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3582040" class="blog_comment_body"><fieldset class="comment_quote"><legend>引用</legend>public class Test {<br>    public static void main(String[] args)  {<br>         <br>    }<br>     <br>    public void test(final int b) {<br>        final int a = 10;<br>        new Thread(){<br>            public void run() {<br>                System.out.println(a);<br>                System.out.println(b);<br>            };<br>        }.start();<br>    }<br>}</fieldset>这个地方的代码,字节码反编译后不是你上面说的那样的,其中内部类Test$1的构造函数应该有2个参数,一个是Test,一个是int</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3582040,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3582040,'Bury',this)">反对(0)</a></div><span id="comment_3582040_avatar" style="display:none;">http://pic.cnblogs.com/face/891968/20160204145343.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3752053" class="layer">#34楼</a><a name="3752053" id="comment_anchor_3752053"></a>  <span class="comment_date">2017-08-07 14:19</span> <a id="a_comment_author_3752053" href="http://home.cnblogs.com/u/510183/" target="_blank">donaldfischer</a> <a href="http://msg.cnblogs.com/send/donaldfischer" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3752053" class="blog_comment_body">终于解释透了匿名内部类为何是final</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3752053,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3752053,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3755939" class="layer">#35楼</a><a name="3755939" id="comment_anchor_3755939"></a>  <span class="comment_date">2017-08-11 18:26</span> <a id="a_comment_author_3755939" href="http://home.cnblogs.com/u/855621/" target="_blank">龙龙酒家</a> <a href="http://msg.cnblogs.com/send/%E9%BE%99%E9%BE%99%E9%85%92%E5%AE%B6" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3755939" class="blog_comment_body">外部类只能被public和包访问两种权限修饰<br>对于这个 是不是外部类还可以用默认修饰符</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3755939,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3755939,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3764163" class="layer">#36楼</a><a name="3764163" id="comment_anchor_3764163"></a>  <span class="comment_date">2017-08-23 11:38</span> <a id="a_comment_author_3764163" href="https://www.cnblogs.com/liuzc/" target="_blank">cleverlzc</a> <a href="http://msg.cnblogs.com/send/cleverlzc" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3764163" class="blog_comment_body">内部类不可以是public的</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3764163,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3764163,'Bury',this)">反对(1)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3766412" class="layer">#37楼</a><a name="3766412" id="comment_anchor_3766412"></a>  <span class="comment_date">2017-08-25 15:00</span> <a id="a_comment_author_3766412" href="https://www.cnblogs.com/shakinghead/" target="_blank">摇头耶稣</a> <a href="http://msg.cnblogs.com/send/%E6%91%87%E5%A4%B4%E8%80%B6%E7%A8%A3" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3766412" class="blog_comment_body">666</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3766412,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3766412,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3767553" class="layer">#38楼</a><a name="3767553" id="comment_anchor_3767553"></a>  <span class="comment_date">2017-08-27 16:22</span> <a id="a_comment_author_3767553" href="https://www.cnblogs.com/shakinghead/" target="_blank">摇头耶稣</a> <a href="http://msg.cnblogs.com/send/%E6%91%87%E5%A4%B4%E8%80%B6%E7%A8%A3" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3767553" class="blog_comment_body"><a href="#3299964" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3299964);">@</a>

siiruo
其实,局部内部类和匿名内部类对外部类的局部变量和参数的要求不是非要final,或者说显示的final.只要effectively final就行了。什么意思呢?就是说,只要你的外部类方法的局部变量和参数不修改值就行了,因为不修改,效果上就等于是final型的(effectively final),程序就不会报错。如果你不用final修饰局部变量和参数,然后你还进行了修改,就会报错啦!因为就不是effectively final了。这是我的理解。



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3784382" class="layer">#39楼</a><a name="3784382" id="comment_anchor_3784382"></a>  <span class="comment_date">2017-09-14 17:39</span> <a id="a_comment_author_3784382" href="https://www.cnblogs.com/handsome1013/" target="_blank">wjj1013</a> <a href="http://msg.cnblogs.com/send/wjj1013" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3784382" class="blog_comment_body">写的很好也很详细,多谢</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3784382,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3784382,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3843021" class="layer">#40楼</a><a name="3843021" id="comment_anchor_3843021"></a>  <span class="comment_date">2017-11-17 11:29</span> <a id="a_comment_author_3843021" href="http://home.cnblogs.com/u/1208786/" target="_blank">峰哥SJF</a> <a href="http://msg.cnblogs.com/send/%E5%B3%B0%E5%93%A5SJF" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3843021" class="blog_comment_body">写的很详细,很受用!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3843021,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3843021,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3865583" class="layer">#41楼</a><a name="3865583" id="comment_anchor_3865583"></a>  <span class="comment_date">2017-12-14 11:09</span> <a id="a_comment_author_3865583" href="http://home.cnblogs.com/u/1299058/" target="_blank">睡你的椒</a> <a href="http://msg.cnblogs.com/send/%E7%9D%A1%E4%BD%A0%E7%9A%84%E6%A4%92" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3865583" class="blog_comment_body"><a href="#3299964" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3299964);">@</a>

siiruo
你这是jdk1。8



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3895801" class="layer">#42楼</a><a name="3895801" id="comment_anchor_3895801"></a>  <span class="comment_date">2018-01-23 16:27</span> <a id="a_comment_author_3895801" href="http://home.cnblogs.com/u/498375/" target="_blank">大江轻舟</a> <a href="http://msg.cnblogs.com/send/%E5%A4%A7%E6%B1%9F%E8%BD%BB%E8%88%9F" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3895801" class="blog_comment_body"><a href="#3389740" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3389740);">@</a>

JintaoXIAO
jdk1.8并不是没有限制。在jdk1.8中,虽然不用显式地将要被局部内部类或者匿名内部类访问的成员变量声明为final,但是在编译阶段,编译器仍然会给这些变量加上final限制。这些变量如果没有显式的声明为final时,如果在成员内部类或者匿名内部类中重新为其赋值,编译器也会报错的。



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3895802" class="layer">#43楼</a><a name="3895802" id="comment_anchor_3895802"></a>  <span class="comment_date">2018-01-23 16:29</span> <a id="a_comment_author_3895802" href="http://home.cnblogs.com/u/498375/" target="_blank">大江轻舟</a> <a href="http://msg.cnblogs.com/send/%E5%A4%A7%E6%B1%9F%E8%BD%BB%E8%88%9F" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3895802" class="blog_comment_body"><a href="#3299964" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3299964);">@</a>

siiruo
jdk1.8中,不用显式地将这些变量声明为final。编译器会自动加上final修饰之



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3895850" class="layer">#44楼</a><a name="3895850" id="comment_anchor_3895850"></a>  <span class="comment_date">2018-01-23 17:07</span> <a id="a_comment_author_3895850" href="http://home.cnblogs.com/u/498375/" target="_blank">大江轻舟</a> <a href="http://msg.cnblogs.com/send/%E5%A4%A7%E6%B1%9F%E8%BD%BB%E8%88%9F" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3895850" class="blog_comment_body">楼主:2.为什么局部内部类和匿名内部类只能访问局部final变量?这个问题下的第一个例子是不是搞错了,反编译的结果跟代码不一致吧?你用来说明这个问题的例子一的代码应该是:??<br><div class="cnblogs_Highlighter sh-gutter"><div><div id="highlighter_586778" class="syntaxhighlighter  java"><div class="toolbar"><span><a href="#" class="toolbar_item command_help help">?</a></span></div><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">Test {</code></div><div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java keyword">void</code> <code class="java plain">main(String[] args)&nbsp; {</code></div><div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div><div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div><div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">test() {</code></div><div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">final</code> <code class="java keyword">int</code> <code class="java plain">a = </code><code class="java value">10</code><code class="java plain">;</code></div><div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Thread(){</code></div><div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">run() {</code></div><div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">System.out.println(a);</code></div><div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">};</code></div><div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}.start();</code></div><div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div><div class="line number14 index13 alt1"><code class="java plain">}</code></div></div></td></tr></tbody></table></div></div></div></div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3895850,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3895850,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3924581" class="layer">#45楼</a><a name="3924581" id="comment_anchor_3924581"></a>  <span class="comment_date">2018-03-16 09:36</span> <a id="a_comment_author_3924581" href="https://www.cnblogs.com/lgh1992314/" target="_blank">N3verL4nd</a> <a href="http://msg.cnblogs.com/send/N3verL4nd" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3924581" class="blog_comment_body"><a href="#3259426" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3259426);">@</a>

零度冰川

外部了中可以包含N多的内部类,如果想访问内部类的成员,则需要设置N多的this引用。故外部类不能访问内部类的成员。

http://pic.cnblogs.com/face/409026/20170110151935.png

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#3931193" class="layer">#46楼</a><a name="3931193" id="comment_anchor_3931193"></a>  <span class="comment_date">2018-03-23 15:12</span> <a id="a_comment_author_3931193" href="https://www.cnblogs.com/jjinzhang/" target="_blank">吾止于至善</a> <a href="http://msg.cnblogs.com/send/%E5%90%BE%E6%AD%A2%E4%BA%8E%E8%87%B3%E5%96%84" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3931193" class="blog_comment_body"><img src="//images2018.cnblogs.com/blog/684042/201803/684042-20180323150824815-349060244.png" alt="" border="0" "=""><br>静态内部类Bean2的外部类是Test 所以初始化Bean2时直接new也是可以的,Bean2 bean2 = Bean2();因为外部类的方法是一个主函数(静态的)所以初始化Bean1只能是文章中的那种,如果外部类中一个普通的方法那初始化Bean1也是可以直接创建的。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3931193,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3931193,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#4050558" class="layer">#47楼</a><a name="4050558" id="comment_anchor_4050558"></a>  <span class="comment_date">2018-08-25 17:07</span> <a id="a_comment_author_4050558" href="http://home.cnblogs.com/u/1473121/" target="_blank">不要绩效B</a> <a href="http://msg.cnblogs.com/send/%E4%B8%8D%E8%A6%81%E7%BB%A9%E6%95%88B" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_4050558" class="blog_comment_body">写的非常详细,对菜鸟来说很受用。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4050558,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(4050558,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"></span>
			</div>
			<a href="#4094521" class="layer">#48楼</a><a name="4094521" id="comment_anchor_4094521"></a><span id="comment-maxId" style="display:none;">4094521</span><span id="comment-maxDate" style="display:none;">2018/10/20 9:03:58</span>  <span class="comment_date">2018-10-20 09:03</span> <a id="a_comment_author_4094521" href="https://www.cnblogs.com/Dbbf/" target="_blank">coyol</a> <a href="http://msg.cnblogs.com/send/coyol" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_4094521" class="blog_comment_body">局部内部类好像可以访问外部类的成员吧</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(4094521,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(4094521,'Bury',this)">反对(0)</a></div><span id="comment_4094521_avatar" style="display:none;">http://pic.cnblogs.com/face/977795/20170322125609.png</span>
		</div>
	</div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>

猜你喜欢

转载自blog.csdn.net/weixin_42915286/article/details/83585143