黑马程序员技术交流社区

标题: 静态代码块的问题,求解答,谢谢 [打印本页]

作者: 林康春    时间: 2011-12-31 18:42
标题: 静态代码块的问题,求解答,谢谢
本帖最后由 林康春 于 2012-1-1 00:28 编辑

class StaticCode
{
        int num = 9;
        StaticCode()///构函数
        {
                System.out.println("b");
        }

        Static //静态代码块
        {
           System.out.print("a");        }
                {
                System.out.print("c"+this.num);
        }


        StaticCode(int x)
        {
                System.out.print("d");
        }
        public static void show()
        {
                System.out.println("show run");
        }
}

class StaticCodeDemo
{
        static
        {
                //System.out.println("b");
        }
        public static void main(String[] args)
        {
                new StaticCode(4);
}
}
疑问:
1.当上面绿色的部分存在时,输出结果为ac9d,当绿色部分不存在时,编译不通过: 无法从静态上下文中引用非静态 变量 this System.out.println("a"+this.num);
这是为什么呢?
2.上面红色部分:this.num是什么意思?this代表什么?


作者: 孙海亮    时间: 2011-12-31 19:14
因为你那num是成员变量,静态代码块在类被执行时它就已经进内存了!而num是要在创建对象时它才进内存。所以当静态代码块被执行时,num还不存在呢。
this 代表其所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。所以this.num就是指new StaticCode的num
作者: 刘旭    时间: 2011-12-31 19:40
当 new StaticCode(4);,代码执行的顺序为:虚拟机加载StaticCode.java、执行静态代码块、执行非静态代码块、构造器。
this的用法一班有两种:1.代表当前有用对象,即调用属性或方法的对象。例如本题中,代表的就是new StaticCode(4)所代表的对象。
2.方法或构造器重载时,调用本类中的方法或构造器。
例如:
class Test{
     Test(){ System.out.println("构造器1");   }
     Test(int a){    this();  System.out.println("构造器2");  }
     viod  f(int  a){    System.out.println("方法1");      }
     viod  f(int  a,int  b){ this(4)   System.out.println("方法2");      }
}
以上代码仅供说明问题,没任何实际意义
作者: 林康春    时间: 2011-12-31 19:56
孙海亮 发表于 2011-12-31 19:14
因为你那num是成员变量,静态代码块在类被执行时它就已经进内存了!而num是要在创建对象时它才进内存。所以 ...

this语句 :用于构造函数之间进行互相调用。
但在这里:this System.out.println("a"+this.num);
this怎么可以用呢? 这里是构造函数吗
作者: 孙海亮    时间: 2011-12-31 22:26
林康春 发表于 2011-12-31 19:56
this语句 :用于构造函数之间进行互相调用。
但在这里:this System.out.println("a"+this.num);
this怎么 ...

那是this语句。现在这个是this关键字。this的用法:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
作者: 刘建宇    时间: 2012-1-1 15:19
静态代码块是给类初始化的,类加载进内存的时候就会被执行,而this是代表对象的引用,哪个对象调用就代表哪个对象,当执行静态代码块是还没有对象,所以编译不通过,静态里面不能使用非静态的数据




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