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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张伟~ 黑马帝   /  2012-1-31 12:15  /  1625 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张伟~ 于 2012-2-2 13:27 编辑

class Test
{
        static
        {
                age=3;
        }
        static int age=1;
}

class TestDemo
{
        public static void main(String[] args)
        {
                System.out.println(Test.age);
        }
}
输出结果为1。
age明明定义在后,但是编译运行都OK,
然后在age=3;后加句System.out.println(age);
编译直接不通过。
前后一比较,大概意思是弄出来了,但是用大白话怎么解释这原理呢。
按我的想法就是在类加载的时候静态代码块里的变量可以引用后面的静态变量,但是这时候的age=3还不能被调用,因为要按这里代码的顺序是要先初始静态代码块,在初始化静态变量,
当他们都初始化完后面就可以调用age了。
就像这样的话
class Test
{
        static
        {
                age=3;
        }
        static int age;
}

class TestDemo
{
        public static void main(String[] args)
        {
                System.out.println(Test.age);
        }
}
结果输出为3。
不知道大家怎么看的呢

评分

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

查看全部评分

5 个回复

倒序浏览
static {
age = 2;
} 是给变量age赋值

static int age = 1; 是申明变量age并赋值

打印age的值是1;

1.静态代码块和静态变量 拥有同级的初始化顺序,按自上而下的编码顺序进行初始化;所以age的值是1;
2.在java程序中使用变量(包含静态变量)之前,申明变量即可,申明的编码位置不一定要写在使用之前(可以放在类定义的最后面,即变量的申明、使用和代码书写位置无关)

评分

参与人数 1黑马币 +3 收起 理由
荣凯旋 + 3

查看全部评分

回复 使用道具 举报
java定义(声明)变量的位置无关,不然你的代码就出错了,相当于:
static int age;
static
        {
                age=3;
        }
static  {  age=1;}

而声明在后,效果是一样的:
static
        {
                age=3;
        }
static  {  age=1;}
static int age;

评分

参与人数 1黑马币 +3 收起 理由
荣凯旋 + 3

查看全部评分

回复 使用道具 举报
本帖最后由 张伟~ 于 2012-2-1 11:36 编辑

感觉你们没说到点子上啊,java定义(声明)变量的与位置无关,这个好理解。
我所说的在age=3;后加句System.out.println(age);
编译直接不通过。这句话你们根本就搭理,重点的地方也就在这里
  static
        {
                 age=3;                            和
         }
         static int age=1;

  static
        {
                 age=3;
                 System.out.println(age);
         }
         static int age=1;
为什么一个能过,后面那个不能过?
也就是说静态代码块里的age在类加载的时候如果前面没定义它,它可以自发去后面寻找看有没有定义过,但是这时候只是简单的声明一个值而已,还不能调用它,静态代码块都没加载完,后面的静态变量还在排队呢。
如果把打印语句取消的话,为什么能打印出结果1?因为这时属性都已经初始化完了,也就随便你调用了。加上打印语句的话不就是说我static int age=1;都还没加载到,就像是你知道孕妇肚子里的是一个人,但是你不能叫这个人还没出生就叫他哭几声给你听吧。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
java中普通变量不能先定义后使用吧!
------------------
class Test
{
        static
        {
                age=3;
        }
        static int age=1;
}

class TestDemo
{
        public static void main(String[] args)
        {
                System.out.println(Test.age);
        }
}
------------------------这段代码没问题   证明了静态变量可以先定义再赋值,结果为1
class Test
{
        static
        {
                age=3;
        }
        static int age;
}

class TestDemo
{
        public static void main(String[] args)
        {
                System.out.println(Test.age);
        }
}
---------------------------------------这段代码证明了上面一样的结论。
static
        {
                 age=3;                           
         }
         static int age=1;

  static
        {
                 age=3;
                 System.out.println(age);                     //错误提示是‘不能在字段定义之前引用它’
         }
         static int age=1;
-------------------------------那么可以这样说静态变量可以在定义申明之前进行赋值操作,但是要使用它进行运算打印什么的,也就是使用它,必须在申明定义语句之后!!代码改成如下就没有问题了
---

static
        {
                 age=3;                           
         }
         static int age=1;

  static
        {
                 age=3;
                          }
         static int age=1;
static{
    System.out.println(age);

}
---------------------------就可以打印出age的值了。不知道我说清楚了没有

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 最初的理想 于 2012-2-1 16:37 编辑

重复删除
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马