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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 糯米酿酒 中级黑马   /  2013-7-20 18:50  /  1228 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么时候用静态代码块,什么时候用构造代码块,他们最主要的作用是什么?

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

8 个回复

倒序浏览
静态代码块定义在类中,随类的加载而执行,优先于主函数执行并且只执行一次,用来给类进行初始化。
当类中的方法都被静态了化,并且构造方法被private了,但是是我们不能在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块
构造代码块定义在类中,可以给所有对象进行初始化,只要建立对象就会运行优先于构造函数。
构造代码块实际上就是不同对象共性的初始化方式,当类有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化,这样可以减少代码的重复。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报


1、静态代码块的执行:
public class StaticTest {
    static
    {
        System.out.println("hello,world!");
        System.exit(0);
    }
    public static void main(String[] args)
    {
        System.out.println("main");
    }
}

在这段代码中,StaticTest类一加载,首先就执行了static代码块,虽然这里有main函数,只是这段代码的入,通过Eclipse的断点测试,根本就没有执行到就结束了,这里的main函数就是为了让代码能够执行才有的。

2、构造代码块的执行:
public class StaticTest {
    static
    {
        System.out.println("静态代码块!");
        //System.exit(0);
    }
   
    {
      
        System.out.println("构造代码块!");
    }
   
   
    public static void main(String[] args)
    {
        StaticTest st = new StaticTest();  //在对象一建立的时候就调用
        System.out.println("主函数!");   
    }
}

在这段代码中,有一个构造代码块,这个代码块是在对象一建立的时候就调用,在函数体中,他的执行时间是看对象是什么时候建立的。

3、总结:静态代码块是在类一被加载的时候就执行,如果在静态代码块中加入System.exit(0);语句,则会直接结束这个程序,不会再执行main函数中的语句。而构造代码块则不同,因为要先建立对象,再调用代码块中的语句,所以main函数是肯定要执行的。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
搞那么麻烦干什么。静态代码块随着类的加载而加载,随着类的结束而终止。
构造代码块 每次new一个对象就运行一次。new一次运行一次  new一次运行一次。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
我刚问过这个问题 呵呵 这样你比较易于理解
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。
  构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。
  构造函数:  给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。  
   创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数
  
//利用代码进行测试 例题:06--06:StaticCodeDemo.java
class Person
{
private String name;
private int age=0;
private static String country="cn";
Person(String name,int age)
{
  this.name=name;
  this.age=age;
}
static
{
  System.out.println("静态代码块被执行");
}
{ System.out.println(name+"..."+age); }
public void setName(String name)
{
  this.name=name;
}
public void speak()
{
  System.out.println(this.name+"..."+this.age);
}
public static void showCountry()
{
  System.out.println("country="+country);
}
}
class StaticDemo
{
static
{
  System.out.println("StaticDemo 静态代码块1");
}
public static void main(String[] args)
{
  Person p=new Person("zhangsan",100);
  p.setName("lisi");
  p.speak();
  Person.showCountry();
}
static
{
  System.out.println("StaticDemo 静态代码块2");
}
}
输出结果:
   StaticDemo 静态代码块1
   StaticDemo 静态代码块2
   静态代码块被执行
   null...0    //构造代码块
   lisi...100  //speak()
   country=cn  //showCountry()

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
静态代码块定义在类中,随类的加载而执行,优先于主函数执行并且只执行一次,用来给类进行初始化。
当类中的方法都被静态了化,并且构造方法被private了,但是是我们不能在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块
构造代码块定义在类中,可以给所有对象进行初始化,只要建立对象就会运行优先于构造函数。
构造代码块实际上就是不同对象共性的初始化方式,当类有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化,这样可以减少代码的重复。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
总而言之,静态代码块是随类的加载而加载,且优先于主函数,而构造代码块是随对象的建立而加载,优先于构造函数。静态代码块的使用:类中的方法都为static类型,构造函数为private时;构造代码块:创建的对象有共同的初始化时,,可以提高代码的复用性。
回复 使用道具 举报
静态代码块与构造代码块在初始化中的加载顺序不一样,静态代码块定义在类中,随类的加载而执行,优先于主函数执行并且只执行一次,用来给类进行初始化。初始化的步骤:
1.调用.class
2.static代码块初始化
3.默认初始化
4.显示初始化
5.构造代码块初始化
6.构造函数初始化

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
静态代码块基本上很少用的。。。除非有一些代码要在当类一加载的时候就需要使用。。。比如main方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马