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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-9 10:28  /  2444 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • class Outer
  • {
  •         int x=3;
  •         void method()
  •         {
  •                 final int y=4//为什么?原因,
  •                 class Inner//内部类处于局部中。不能被成员修饰符修饰
  •                 {
  •                         void function()
  •                         {
  •                                 System.out.println(y);//内部类访问局部变量需要最终
  •                         }
  •                 }
  •         }
  • }
  • class InnerDemo4
  • {
  •         public static void main(String [] args)
  •         {
  •                 new Outer().method();
  •         }
  • }


复制代码

点评

你要问的是什么问题呀?下次说的清楚点啊  发表于 2012-7-9 12:52

4 个回复

倒序浏览
恕我愚钝,楼主的问题不是很明白。希望问题详细点,方便大家思考。
回复 使用道具 举报
本帖最后由 高原 于 2012-7-9 11:04 编辑

  • 这个问题我想了很久,想到了一种解释方法,你看看怎么样
  • 首先我把代码修改一下,注意我修改时候的代码是不对的,为什么不对,我会解释
  • class Outer
  • {
  •         int x=3;
  •         void method()
  •         {
  •                 int y=4;   //注意这里我把final去掉了
  •                 class Inner//内部类处于局部中。不能被成员修饰符修饰
  •                 {
  •                         void function()
  •                         {
  •                                 System.out.println(y);    //局部内部类访问了非final修饰的局部变量,这样是不对的,为什么,我下面解释
  •                         }
  •                 }
  •                 y = 5;    //由于y不是final,这样写没有错
  •                 new Inner().function();      //你的代码里这里没有new Inner的对象,所以你的程序是没有打印结果的,这里不要忘了
  •                 y = 6;      //注意了这里就是关键所在,如果内部类访问了一个非final的局部变量,既然是非final,它的值就可以随时改变,那么问题就来了,
  •                          //这里的局部变量 y 有三个值,请问new Inner().function();,这个Inner对象到底访问的是哪一个 y 呢?这个连虚拟机自己都搞不清了
  •                          //如果你非要说访问的是 y = 5,那么访问之后y的值又变成 y = 6 了,那么这个Inner去访问一个一直改变的值又有什么意义呢?  
  •                          //所以局部内部类访问局部变量时,此局部变量必须由final修饰
  •                     //以上是我的理解,欢迎大家指正和补充
  •         }
  • }
  • class InnerDemo4
  • {
  •         public static void main(String [] args)
  •         {
  •                 new Outer().method();
  •         }
  • }


评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
回复 使用道具 举报
本帖最后由 贾存双 于 2012-7-9 19:00 编辑

class OutTer{
        private String str = "hello" ;  //定义属性
        public void fun (final int temp){                //定义方法
                class InNer{                //在方法中定义内部变量
                        public void prin(){                        //定义内部类方法
                                System.out.println("访问外部类中的属性:"+str) ;
                                System.out.println("外部类方法的参数:"+temp) ;
                        }
                }
                        new InNer().prin() ;
        }
}
public class InnerDemo6{
        public static void main(String args[]){
                new OutTer().fun(30) ;        //实例化
        }
}



注意:在方法中定义的内部类,只能实例化外部类的方法,而不能实例化方法中的内部类对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马