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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常在河边走_ 中级黑马   /  2013-9-14 19:37  /  2522 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-14 22:34 编辑

class StaticDemo{
        //静态代码块
        static
        {
                System.out.println("静态初始化块...");
        }
        static final String a = "哈哈";
}

public class Test{
        public static void main(String[] args) {
                System.out.println(StaticDemo.a);        //这里调用了StaticDemo类的方法,为什么静态代码块不能运行
        }
}
请问什么我获取a的值, Static中的静态代码块不会执行?

评分

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

查看全部评分

8 个回复

倒序浏览
如果一个静态成员是编译时常量则对它的引用不会引起定义它的类的初始化。
static final String a = "哈哈";a是个静态常量所以对应它的引用不引起StaticDemo类的初始化,所以静态块也不会初始化

评分

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

查看全部评分

回复 使用道具 举报
static final String a = "哈哈";  定义a变量时不要使用final  去掉final就ok了
回复 使用道具 举报
final:最终
final修饰变量叫做最终变量
final变量必须赋初始值
final变量不能修改值

final也可以用于修饰方法内的变量
final修饰的变量只能被赋值一次

由于类的加载在JVM中只进行一次,因此静态代码块只能被运行一次
1.访问静态变量时运行
2.访问静态方法时运行
3.创建对象的时候运行

由于final变量的存储问题……所以并不是调用的类中…… 把final去掉就可以了……
  1. class StaticDemo{
  2.     //静态代码块
  3.    static
  4.     {
  5.             System.out.println("静态初始化块...");
  6.     }
  7.     static String a = "哈哈";
  8. }

  9. public class Test{
  10.     public static void main(String[] args) {
  11.             System.out.println(StaticDemo.a);        //这里调用了StaticDemo类的方法,为什么静态代码块不能运行
  12.             
  13.    }
  14. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
类加载的时机:第一次创建对象,第一次访问类的静态成员,只是声明引用不会发生类加载
但对于static final String a = "哈哈";属于直接赋值,JVM在编译的时候就已经知道变量a的值,所以不会发生类加载,但如果这样写:static final String a = String.valueOf("哈哈");这属于间接赋值,会发生类加载

评分

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

查看全部评分

回复 使用道具 举报
静态代码块在类加载的时候就会运行,而且只运行一次。一般而言,在创建类的对象或调用类里面的静态成员的时候,类就会被加载,静态代码也会随之被执行。就上面程序而言,主方法和静态代码块在同一个类,所以主方法一运行,类就会被加载进内存,静态代码块也会被执行,所以在调用变量的时候,不会在执行静态代码块。

评分

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

查看全部评分

回复 使用道具 举报
在虚拟机加载类的时候就会加载执行,而且只执行一次,所以第一步是类加载,注意!static块,也就是静态块,在类加载的时候就执行了,而且只执行一次,因为不可能进行第二次类加载,从这个意义上说,静态的成员是第一时间执行的,然后才轮到别人!
回复 使用道具 举报
因为静态优先于对象存在,对象一创建他就会自动执行一次,只有创建对象才会运行一次,你只是调用了类的方法并没有创建对象
回复 使用道具 举报
静态代码块的执行,只在程序加载阶段,并且只执行一次。

也就是说,当我们执行某段程序时,在最初的 相关class类加载到方法区,之后会自动执行类内的静态代码块。

了解 “静态”相关知识点,由一个窍门儿,就是,所有“静态”在内存的加载都与 代码中的“对象”,“调用”等咱们“人”所编写的任何动作无关,他的加载由虚拟机控制~~~。

评分

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

查看全部评分

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