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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林康春 黑马帝   /  2011-12-31 18:42  /  3109 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林康春 于 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代表什么?

评分

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

查看全部评分

5 个回复

正序浏览
静态代码块是给类初始化的,类加载进内存的时候就会被执行,而this是代表对象的引用,哪个对象调用就代表哪个对象,当执行静态代码块是还没有对象,所以编译不通过,静态里面不能使用非静态的数据
回复 使用道具 举报
林康春 发表于 2011-12-31 19:56
this语句 :用于构造函数之间进行互相调用。
但在这里:this System.out.println("a"+this.num);
this怎么 ...

那是this语句。现在这个是this关键字。this的用法:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
回复 使用道具 举报
孙海亮 发表于 2011-12-31 19:14
因为你那num是成员变量,静态代码块在类被执行时它就已经进内存了!而num是要在创建对象时它才进内存。所以 ...

this语句 :用于构造函数之间进行互相调用。
但在这里:this System.out.println("a"+this.num);
this怎么可以用呢? 这里是构造函数吗
回复 使用道具 举报
刘旭 黑马帝 2011-12-31 19:40:59
藤椅
当 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");      }
}
以上代码仅供说明问题,没任何实际意义

评分

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

查看全部评分

回复 使用道具 举报
因为你那num是成员变量,静态代码块在类被执行时它就已经进内存了!而num是要在创建对象时它才进内存。所以当静态代码块被执行时,num还不存在呢。
this 代表其所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。所以this.num就是指new StaticCode的num

评分

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

查看全部评分

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