黑马程序员技术交流社区

标题: 局部中的内部类怎么访问局部中的变量? [打印本页]

作者: 陈汉维    时间: 2012-8-17 12:51
标题: 局部中的内部类怎么访问局部中的变量?
本帖最后由 陈汉维 于 2012-8-17 13:37 编辑

package test;
import org.junit.Test;
public class Outer {
int num = 8;
@Test
public void method(){
  final int num = 5;-->怎么访问这个
  class Inner{
   int num = 3;
   public void show(){
    System.out.println(num); //结果:3
    System.out.println(this.num); //结果:3
    System.out.println(Outer.this.num); //结果:8
   }
  }
  Inner in = new Inner();
  in.show();
}
}

外部类的变量名、局部中的变量名、局部中内部类的变量名都为num的情况下,怎么访问局部中的变量名?
知道的请回答下,谢谢!!!

作者: 陈汉维    时间: 2012-8-17 13:06
{:soso_e136:}怎么没人回答,求解!谢谢
作者: 焦晨光    时间: 2012-8-17 13:08
本帖最后由 焦晨光 于 2012-8-17 13:10 编辑

在内部类的构造方法中加入外部类的局部变量就可以访问。
我现在在网吧,无法测试,你可以试一下。
class Inner{
   int num = 3;
   public void show(){
    System.out.println(num); //结果:3
    System.out.println(this.num); //结果:3
    System.out.println(Outer.this.num); //结果:8
                    }   
public Inner(int num)
{
  this.num=num;
  System.out.println(num);
}

}

作者: 陈汉维    时间: 2012-8-17 13:12
焦晨光 发表于 2012-8-17 13:08
在内部类的构造方法中加入外部类的局部变量就可以访问。
我现在在网吧,无法测试,你可以试一下。
class In ...

不行。这样只能访问到局部中内部类的num。我要访问的是局部中的变量num
作者: 焦晨光    时间: 2012-8-17 13:16
你在外部方法中将值传进去也不可以吗?
public void method(){
  final int num = 5;-->怎么访问这个
  Inner(num);//后面加这个语句,如果还不可以,我也就迷茫了
作者: 黎健东    时间: 2012-8-17 13:21
你都已经重写了,你把它的变量名变一下,你就会发现可以访问了
作者: 牛杨    时间: 2012-8-17 13:26
这个问题 我曾经试过,想了好长时候。应该是没法再内部流中访问到  final int num = 5;

要么修改 这个变量的名称。
要么就在method方法的里面(Inner类的)外面来访问这个 final int num = 5;

我认为是这样,不知道还有没有别的更好的办法了。 持续关注中……
作者: 陈汉维    时间: 2012-8-17 13:28
焦晨光 发表于 2012-8-17 13:16
你在外部方法中将值传进去也不可以吗?
public void method(){
  final int num = 5;-->怎么访问这个

{:3_48:}不行。我访问的是外部类中的方法中的常量,该常量在内部类外面。
作者: 陈汉维    时间: 2012-8-17 13:28
黎健东 发表于 2012-8-17 13:21
你都已经重写了,你把它的变量名变一下,你就会发现可以访问了

{:3_48:}被final修饰了,怎么被重写。那是一个常量
作者: 陈汉维    时间: 2012-8-17 13:36
牛杨 发表于 2012-8-17 13:26
这个问题 我曾经试过,想了好长时候。应该是没法再内部流中访问到  final int num = 5;

要么修改 这个变量 ...

{:3_48:}我估计只能这样了。貌似没法直接访问。
作者: 牛杨    时间: 2012-8-17 13:38
陈汉维 发表于 2012-8-17 13:36
我估计只能这样了。貌似没法直接访问。

再等等吧 ,把问题置顶。 说不定都有高手来有更好的解释了。
作者: 陈汉维    时间: 2012-8-17 13:51
牛杨 发表于 2012-8-17 13:38
再等等吧 ,把问题置顶。 说不定都有高手来有更好的解释了。

挽尊啊。木人回答,蛋疼
作者: 黎健东    时间: 2012-8-17 16:42
本帖最后由 黎健东 于 2012-8-17 16:43 编辑
陈汉维 发表于 2012-8-17 13:28
被final修饰了,怎么被重写。那是一个常量

public class Test001_InnerClass {
        public static void main(String[] args){
                method();
        }

        private static void method() {
                final int x = 0;
//                int y = 1;
                class inner{
                        //存在以下的一个拷贝
                        //final int x = 0;
                        //不能访问
//                        y = 2;
                        //如果你把这个注释解开,就是用x=1了,不会使用x=0,可以理解成重写(不准确),也可以说跳过访问
//                        int x = 1;
                        public inner() {
                                System.out.println(x);
                                //下面不能访问
//                                System.out.println(y);
                        }
                }
                new inner();
        }
}


输出的结果为0,说明访问了 final int x = 0;
作者: 王峰    时间: 2012-8-17 16:48
呵呵,不能钻牛角尖啊,这在理论上根本不可能啊,如果你想在Inner中访问final int num=5;那么你是想破坏java的理论基础啊,这是不可能的,
作者: 王峰    时间: 2012-8-17 16:51
哎,首先java中的全局变量在类中定义,主类中定义static就是全局变量了,这个你肯定知道,。。。。。,C++中的全局变量在外面可以定义,JVM加载顺序是。。。。。其实你很明白。。。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2