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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐升2013 中级黑马   /  2013-3-12 14:03  /  1443 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐升2013 于 2013-3-12 15:46 编辑

public class TestInner
{
        public static void main(String args[])
        {
                Outer outer = new Outer();
                outer.inst(5);
        }
}

class Outer
{

        int score = 95;
        void inst(final int s)
        {
                final int temp = 20;
               
                class Inner
                {
                        void display()
                        {
                        String name = "张三";
                        System.out.println(name+"成绩是:scoer = "+(score+s+temp));
                        }
                }
                Inner in = new Inner();
                in.display();
        }
        
}


这段代码是修改后的代码了,修改之前,错误很多,都是没有final修饰的原因,这里也看过视频了,说是必须final修饰,但是不太理解里面的原理。也就是说内部类是在什么时候加载进内存的?是在调用该方法时加载的还是创建内部类对象的时候加载的。加载的顺序是什么?为什么一定要用final修饰?

评分

参与人数 1技术分 +1 收起 理由
scott0610 + 1

查看全部评分

4 个回复

倒序浏览
Java要求所有被内部类访问的局部变量都使用final修饰也是有其原因的:对于普通的局部变量而言,它的作用域就是停留在该方法内,
当方法执行结束,该局部变量也随之消失;但在内部类则可能产生隐式的“闭包”,闭包将使得局部变量脱离它所在的方法继续存在。
非静态内部类属于类对象成员,在创建该对象的时候,为内部类分配内存空间,及初始化。
回复 使用道具 举报
袁见 发表于 2013-3-12 15:06
Java要求所有被内部类访问的局部变量都使用final修饰也是有其原因的:对于普通的局部变量而言,它的作用域 ...

闭包这个词没听说过啊,我先继续往后看了 就当成是一个规则理解好了
回复 使用道具 举报
你问内部类何时加载进内存,这很简单,我拿代码做个试验,内部内分为静态内部类和非静态内部类,首先是静态内部类,创建静态内部类无需创建外部类,使用new 外部类.内部类()格式创建,创建非静态内部类你必须先有外部类对象,用new外部类().内部内()创建,看下面一段代码
  1. public class TestMyInner
  2. {
  3.         public static void main(String args[])
  4.         {
  5.                 //Outer1.Inner1 oi = new Outer1.Inner1();
  6.              new Outer1().new Inner2();
  7.         }
  8. }

  9. class Outer1
  10. {
  11.            static {
  12.                    System.out.println("外部类静态代码块得到执行");
  13.            }
  14.        static class Inner1{
  15.                 static {
  16.                         System.out.println("内部类静态代码块得到执行");
  17.                 }
  18.                 {
  19.                         System.out.println("内部类非静态代码块得到执行");
  20.                 }
  21.        }
  22.        {
  23.                System.out.println("外部类非静态代码块得到执行");
  24.        }
  25.       
  26.        class Inner2 {
  27.                     {
  28.                             System.out.println("内部类非静态代码块得到执行");
  29.                     }
  30.        }
  31.         
  32. }
复制代码
此程序运行时可以看到,不管是静态内部类还是非静态内部类,创建外部类时只是能将外部类加载进内存,只有创建内部类对象时才能将其加载进内存
回复 使用道具 举报
vmvm555 发表于 2013-3-12 17:17
你问内部类何时加载进内存,这很简单,我拿代码做个试验,内部内分为静态内部类和非静态内部类,首先是静态 ...

谢谢你的回答了,感觉学的越多越开始绕了。。今天看的进度老慢了,各种疑难杂症
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马