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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林晓泉 中级黑马   /  2012-10-31 00:57  /  1984 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

帮别人回答问题时发现的问题
  1. public class Static
  2. {
  3.                static
  4.              {
  5.                             x = 5;
  6.                            //System.out.println(x);//为什么这句不能编译通过
  7.     }
  8.             static int x;
  9.             public static void main(String args[])
  10.             {
  11.                          System.out.println(x);//输出 5
  12.       }
  13. }
复制代码

未命名.jpg (11.47 KB, 下载次数: 110)

编译错误

编译错误

点评

x=5 X定义什么类型要写啊 int x=5  发表于 2012-10-31 01:17

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

7 个回复

倒序浏览
编译时,第一个走的是静态块。你的x定义带静态块的下面了,静态块找不到x了。
回复 使用道具 举报
你必须先定义x,因为你定义的是在静态下面.抒所以程序找不到
回复 使用道具 举报
被static修饰的代码是按顺序结构从上到下依次加载内存中的方法区.
上边代码static代码块中的x与下文中被static修饰的成员变量x没一毛钱关系.
因此在定义变量时需要声明数据类型.
因此static代码块中的syso语句编译出错.
你可以在代码块中给他声明类型,也可以将下边的static成员变量放到代码块上面.就不会编译错误了.

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
我感觉这道题设计到代码的加载先后顺序。

我的测试方法:
  1. public class StaticTest {

  2.         static {
  3.                 x = 5;
  4. //                System.out.println(x);//为什么这句不能编译通过
  5.         }
  6.         static int x = 9;

  7.         public static void main(String args[]) {
  8.                 System.out.println(x);// 输出 9
  9.         }
  10. }
复制代码
如果要是先加载静态代码块,再加载变量,按照从上到下的流程来,但是静态代码块中就还没有x,所以x处就应该报错。
如果要是先加载变量,再加载静态代码块,那么这道题输出应该是5,但是就输出9.
就我判断,我感觉应该是:先定义变量,然后,再按照上下顺序,给变量赋值。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
jsfjb 发表于 2012-10-31 08:53
我感觉这道题设计到代码的加载先后顺序。

我的测试方法:如果要是先加载静态代码块,再加载变量,按照从上 ...
  1. class Test
  2. {
  3.         static int x = 9; //定义在静态代码块前面,静态语句中的输出语句能执行,并且主函数中输出5
  4.         static
  5.         {
  6.                 x = 5;
  7.                 System.out.println(x);
  8.         }
  9.         //static int x=9;定义在静态代码块后面,如果不初始化则输出静态代码块中初始化的数据
  10.            //如果初始化的话,就是初始化的值,并且静态代码块只能定义变量的初始值,无法使用它
  11.         public static void main(String[] args)
  12.         {
  13.                 System.out.println(x);
  14.         }
  15. }
复制代码
nice
我按你的想法,改了下代码,印证了你的说法
求这种结果的原理
回复 使用道具 举报
jsfjb 中级黑马 2012-10-31 09:34:52
7#
林晓泉 发表于 2012-10-31 09:27
nice
我按你的想法,改了下代码,印证了你的说法
求这种结果的原理

原理,我也迷惑中,但是,事实是证明了这一点,所以我就发表一下我的想法。哈哈哈
关注中……
回复 使用道具 举报
我认为你没有弄清楚在类与对象之间的加载与初始化关系。

static静态代码块 是随着类的加载而加载是最先执行的。而对象是在类之后建立的。
而你定义的  static int  x;静态的成员变量是属于对象的属性,
自然会在静态代码块之后执行。

所以在你的静态代码块中要明确x的类型

public class Static
{
               static
             {
                            x = 5;//明确x的类型
                           //System.out.println(x);//为什么这句不能编译通过
    }
            static int x;
            public static void main(String args[])
            {
                         System.out.println(x);//输出 5
      }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

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