A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 奋斗的小胖子 于 2014-2-17 20:06 编辑

如题:个人理解应该不可以,因为是局部的,作用域应该就在局部的。如果内部类调用应该用外部类内部类的对象去调用吧。有点晕。请高人解释啊。
顺便问下,博客被评阅后,应该可以不进行下个环节,进行入学测试吧,看前面分数不怎么高,想复习一下的。
在顺便问下入学测试有经验的人,入学测试有多少道题目啊?大概是什么形式的?都是写程序的?
如果有面试经验的也可以说说啊,面试一般多久啊,问的题目很多不?

3 个回复

倒序浏览

方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。因为方法中的代码是由上而下顺序执行的,方法运行结束后,局部变量就被销毁,内部类的生命周期可能会比局部变量的生命周期长;看下面的代码,方法中的内部类 Inner.class 调用方法中的局部变量 x ,正常调用的时候内部类能够调用到方法中的局部变量,并将内部类对象 inner 返回,正常调用结束后,如果方法中的局部变量 x 没有被 final 关键字修饰,x 则会被销毁,我们再通过反射的方式去调用 x 的时候则会发现找不到变量 x ,如果局部变量 x 被 final 关键字修饰后,则 x 在方法运行结束后不会被销毁,而是常驻在内存中直到 JVM 退出,这样再通过反射调用的时候依然可以找到 x 。
import java.lang.reflect.Method;

public class InnerClassCallLocalVar {

@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) throws Exception {
Outer outer = new Outer(); // 正常调用
Object object = outer.outerfun();

Class clazz = object.getClass(); // 反射调用
Method method = clazz.getMethod("innerfun");
method.invoke(object);
}
}

class Outer {
public Object outerfun() {
final int x = 5;
class Inner {
public void innerfun() {
System.out.println(x);
}
}
Inner inner = new Inner();
inner.innerfun();
return inner;
}
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
内部类定义在局部时
  1,不可以被成员修饰符修饰(private static等)
  2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
    但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量
  1.   class Outer
  2.   {
  3.           int x = 3;
  4.           void method(final int a)
  5.           {
  6.                   final int y = 4;
  7.                   class Inner                //内部类定义在局部 成员函数中
  8.                   {
  9.                           void function()
  10.                           {
  11.                                   System.out.println(y);//访问局部变量y,y必须是final
  12.   System.out.println(a);//访问局部变量a,a必须是final
  13.                           }
  14.                   }
  15.                   new Inner().function();       
  16.           }
  17.   }
复制代码
回复 使用道具 举报
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final 或abstract 修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final 修饰符。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer {
public void start() {
new Thread(
new Runable(){
public void run(){};
}
).start();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马