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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

小风1993

中级黑马

  • 黑马币:19

  • 帖子:23

  • 精华:0

© 小风1993 中级黑马   /  2015-5-14 12:42  /  491 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



  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修饰

9 个回复

倒序浏览
第三个是正常用法,
第一个是应为类没有实例化前,类的属性是没有的,加上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);
                    }
            }
    }      
这样是没有错的
第二个
我不能在非静态内部类声明静态的属性方法,除非他是常量
回复 使用道具 举报 1 0
本帖最后由 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了
回复 使用道具 举报
受教了,但还是不明白第二个为什么一定要叫static final
回复 使用道具 举报
BOb_小星 发表于 2015-5-14 13:32
如果System.out.println(test1.test2.i);改为System.out.println(test1.test2.this.i);为什么test2中的i变 ...

这就有点不懂了
回复 使用道具 举报
本帖最后由 李超然 于 2015-5-15 09:48 编辑
白水丶 发表于 2015-5-14 14:21
受教了,但还是不明白第二个为什么一定要叫static final

之前解释错了。
回复 使用道具 举报

你运行看看i的值是不是9,我觉得应该是20
回复 使用道具 举报

运行一下你就懂了
回复 使用道具 举报
受教了。。
回复 使用道具 举报
白水丶 发表于 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限定还是少不了的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马