黑马程序员技术交流社区

标题: 请问大神们,什么叫静态代码块 [打印本页]

作者: yanyoucheng520    时间: 2014-7-18 23:54
标题: 请问大神们,什么叫静态代码块
可不可以稍微举个例子说明下呀
作者: 357016138    时间: 2014-7-19 00:57
就是加上static修饰符就行了吗
无论你创建多少对象,只加载一次
作者: wisely    时间: 2014-7-19 01:49
本帖最后由 wisely 于 2014-7-19 01:55 编辑

静态代码块最好跟构造代码块结合起来看,我举个例子

class Person{
        private String name;
        {
                System.out.println("我是构造代码块");
        }
        Person(){
                System.out.println("我是无参数构造函数");
        }
        Person(String name){
                System.out.println("我是有参构造函数");
        }
        static{
                System.out.println("我是静态代码块");
        }
        public static void show(){
                System.out.println("我是静态方法");
        }
}

public class Sunday{
        public static void main(String[] args) {
                Person.show();   //在运行这句时,需要加载Person类,而随着Person类的加载,静态代码块最先运行,然后才是静态方法。


                Person p1=new Person();  //new 对象时,首先要看看有无【静态代码块】,是否已经运行【静态代码块只能运行一次】。
                                                           //这个例子中,上句代码已经运行了静态代码块,所以在此处就不用再运行。
                                                          //然后就是构造代码块,它是优先于构造函数的,而且每次构造函数都要运行一次,这点与静态代码块不同。
                                                         //运行了构造代码块,再找到相应的构造方法,运行。

                Person p2=new Person("zhangsan");  //与上句代码一样,它要看看前面是否运行过静态代码块,运行过,不再运行。
                                                                               //此处为new 对象,调用了构造函数,所以要先运行构造代码块,然后才是有参数的构造方法。
               
        }
}

经过上面的解说,运行结果想必就能猜出来了。

静态代码块随着类的加载而【运行】,且只运行一次。优先级最高。
构造代码块随着对象的new而运行,每次new对象都要运行一次,优先级次之。
然后才是构造方法。最后提一句,使用静态方法时,不用new对象,直接调用即可。




作者: qqhao01    时间: 2014-7-19 01:50
静态代码块:就是一个有静态关键字标识的一个代码块区域。定义在类中。
格式示例:
        static
        {
        静态代码块中的执行语句。
        }
作用与特点:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象也就只执行一次)。如果和主函数在同一类中,优先于主函数执行。

作者: wisely    时间: 2014-7-19 01:56
wisely 发表于 2014-7-19 01:49
静态代码块最好跟构造代码块结合起来看,我举个例子

class Person{

单独贴一次代码,不知道为什么,一次贴不全
  1. class Person{
  2.         private String name;
  3.         {
  4.                 System.out.println("我是构造代码块");
  5.         }
  6.         Person(){
  7.                 System.out.println("我是无参数构造函数");
  8.         }
  9.         Person(String name){
  10.                 System.out.println("我是有参构造函数");
  11.         }
  12.         static{
  13.                 System.out.println("我是静态代码块");
  14.         }
  15.         public static void show(){
  16.                 System.out.println("我是静态方法");
  17.         }
  18. }

  19. public class Sunday{
  20.         public static void main(String[] args) {
  21.                 Person.show();
  22.                 Person p1=new Person();
  23.                 Person p2=new Person("zhangsan");
  24.                
  25.         }
  26. }
复制代码




作者: M单色调    时间: 2014-7-19 02:57
楼上的讲的很仔细。。。。膜拜!
作者: hejinzhong    时间: 2014-7-19 03:20
一句话概括下我的理解,因为类中没有游离的语句,构造代码块,和静态代码块都可以看作是,将一些游离的语句放在一起组成的块。其实都可以看作是类的特殊成员。一个是非静态,一个有静态的特性。
作者: mytongyong    时间: 2014-7-19 06:34
就是在static下面接的代码块。类加载进内存的时候就被初始化了。
作者: 郑阳阳    时间: 2014-7-19 08:38
静态代码块就是在类中用修饰符static后面接大括号 是值加载一次的 存储在方法区中
作者: Adjin    时间: 2014-7-19 09:40
当类第一次加载的时候,会运行static{}里面的内容,用于给类初始化
作者: David.L    时间: 2014-7-19 09:49
2楼说的很详细了,静态代码块初始化类,构造代码块初始化对象
作者: 黑进制    时间: 2015-7-26 20:07
static修饰的代码块 随类加载 优先执行 只执行一次




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