黑马程序员技术交流社区

标题: 内部类中static final问题 [打印本页]

作者: 小风1993    时间: 2015-5-14 12:42
标题: 内部类中static final问题


  1. import itcase.cicase.min.test1.test2;
  2. import itcase.cicase.min.test1.test2.test3;

  3. public class Test {
  4.         public static void main(String[] args) {
  5.                 test3 t= new test1().new test2().new test3();
  6.                 test2 t2 = new test1().new test2();
  7.                 t2.ch();
  8.                 t.sets();
  9.         }
  10. }

  11. class test1{
  12.         private static int i = 9;
  13. //        public test1(){
  14. //                this.i = 5;
  15. //        }
  16.         class test2{
  17.         private static final int i=20;
  18.                 public void ch(){
  19.                         System.out.println(test1.i);
  20.                         System.out.println(i);
  21.                 }
  22.                 class test3{
  23.                         private int i=30;
  24.                         public void sets(){
  25.                                 System.out.println(test1.i);
  26.                                 System.out.println(test1.test2.i);
  27.                                 System.out.println(i);
  28.                         }
  29.                 }
  30.         }       
  31. }
复制代码
为什么第一个要用static修饰 ,而第二个就要用static final修饰,但第三个就不要有修饰了

如果System.out.println(test1.test2.i);改为System.out.println(test1.test2.this.i);为什么test2中的i变量也不要static final修饰
作者: BOb_小星    时间: 2015-5-14 13:31
第三个是正常用法,
第一个是应为类没有实例化前,类的属性是没有的,加上static转化成类的属性才能用。这也是static正常用法。类名.静态属性(静态方法)
不加static时应该先实例化:
class test1{
    private  int i = 9;
//    public test1(){
//            this.i = 5;
//    }
    class test2{
    private static final  int i=20;
            public void ch(){
                    System.out.println(new test1().i);
                    System.out.println(i);
            }
            class test3{
                    private int i=30;
                    public void sets(){
                            System.out.println(new test1().i);
                            System.out.println(test1.test2.i);
                            System.out.println(i);
                    }
            }
    }      
这样是没有错的
第二个
我不能在非静态内部类声明静态的属性方法,除非他是常量
作者: BOb_小星    时间: 2015-5-14 13:32
本帖最后由 BOb_小星 于 2015-5-14 13:38 编辑

如果System.out.println(test1.test2.i);改为System.out.println(test1.test2.this.i);为什么test2中的i变量也不要static final修饰加了this后你访问的属性就不是test1中的i了

作者: 白水丶    时间: 2015-5-14 14:21
受教了,但还是不明白第二个为什么一定要叫static final
作者: 小风1993    时间: 2015-5-14 16:50
BOb_小星 发表于 2015-5-14 13:32
如果System.out.println(test1.test2.i);改为System.out.println(test1.test2.this.i);为什么test2中的i变 ...

这就有点不懂了
作者: 李超然    时间: 2015-5-14 17:22
本帖最后由 李超然 于 2015-5-15 09:48 编辑
白水丶 发表于 2015-5-14 14:21
受教了,但还是不明白第二个为什么一定要叫static final

之前解释错了。
作者: BOb_小星    时间: 2015-5-14 17:41
小风1993 发表于 2015-5-14 16:50
这就有点不懂了

你运行看看i的值是不是9,我觉得应该是20

作者: BOb_小星    时间: 2015-5-14 17:44
小风1993 发表于 2015-5-14 16:50
这就有点不懂了

运行一下你就懂了
作者: xingfeichen    时间: 2015-5-14 18:10
受教了。。
作者: 李超然    时间: 2015-5-15 09:47
白水丶 发表于 2015-5-14 14:21
受教了,但还是不明白第二个为什么一定要叫static final

一楼已经解释了啊,在非静态类内部类中是不能声明静态变量和非final变量的。对于楼主这个程序来说,test3是test2的内部类,test3中的方法要想不实例化test2就使用test2中的成员变量i,那么test2中的成员变量i就必须是静态的,综上可知test2中的i必须用static final进行限定。当然,如果你在test3中实例化test2后再使用test2中的成员变量i,test2中的成员变量i也可以不是静态的,但是final限定还是少不了的。




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