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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 石头 黑马帝   /  2011-11-3 21:02  /  2282 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态代码块与构造代码块的区别是什么

评分

参与人数 1技术分 +1 收起 理由
admin + 1 看看童鞋们的回答!

查看全部评分

6 个回复

倒序浏览
静态代码块只在第一次new执行一次,之后不再执行,而构造代码块在每new
一次就执行一次。
静态代码块先执行、

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分,继续努力!

查看全部评分

回复 使用道具 举报
静态代码块只能定义在类里面,它独立于任何方法,不能定义在方法里面。

静态代码块里面的变量都是局部变量,只在本块内有效。

静态代码块会在类被加载时自动执行,而无论加载者是JVM还是其他的类。

一个类中允许定义多个静态代码块,执行的顺序根据定义的顺序进行。
-------------------------------------------------------------------
构造方法:
(1) 方法名必须与类名相同。

(2)不要声明返回类型。

(3)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承,所以用final和abstract修饰没有意义。构造方法用于初始化一个新建的对象,所以用static修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,因此用synchronized修饰没有必要。此外,Java语言不支持native类型的构造方法。

静态代码块只能访问类的静态成员,而不允许访问实例成员。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
构造代码块儿是类加载时执行但静态代码块儿是在构造代码块之前被执行的且只能执行一次,
构造代码块儿就不一样了,你只要new了这个类就会调用一次,
静态代码块只能访问静态成员

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分,继续努力!

查看全部评分

回复 使用道具 举报
静态代码块(static block ),不包含在任何方法体中当类被载入时,自动执行静态代码块,且只被执行一次经常用于类属性的初始化。
构造代码块应该就是构造器吧,需要在用new创建实例的时候才能初始化里面的属性。
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
静态代码块是随着类的加载而执行,不管你调不调用它都只执行一次,是最先执行的,是给类进行初始化
而构造代码块也是不管你调不调用都执行,它是在静态代码块执行完后才会执行,它优先于构造函数,是给对象进行初始化的

评分

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

查看全部评分

回复 使用道具 举报
刘永昌 黑马帝 2011-11-4 00:00:42
7#
本帖最后由 lyc 于 2011-11-4 00:02 编辑

其实任何问题只要编程测试一下就O了,这样得到的结果跟靠谱哇。。
关于静态代码块与构造代码块的问题做了个小小的测试:

class Father
{

        static        //父类静态代码块
        {
                System.out.println("父类--静态代码块 ①");
        }

        public Father()        //父类构造方法
        {
               
                System.out.println("父类--构造方法");
        }

        {                        //父类构造代码块
                System.out.println("父类--构造代码块 A");
        }
        static
        {
                System.out.println("父类--静态代码块②");
        }

}
public class test extends Father
{
        static//子类静态代码块
        {
                System.out.println("子类---静态代码块①");
        }
       
        public test()        //子类构造方法
        {
                super();
                System.out.println("子类---构造方法");
        }
       
        {        //子类构造代码块
                System.out.println("子类---构造代码块 a");
        }

        static //子类静态代码块
        {       
                int x=4;
                int y=5;
                System.out.println("子类---静态代码块②\tx="+x+"  y="+y);
        }

        /*void get()//测试静态代码块中的成员是否为全局变量
        {
                System.out.println("x="+x);
                System.out.println("y="+y);
        }
        */
        public static void main(String[] args)
        {
                new Father();
                new test();
                new test();
        }
}

没创建对象直接编译运行时得到一下打印结果:
父类--静态代码块 ①
父类--静态代码块②
子类---静态代码块①
子类---静态代码块②     x=4  y=5

当new几个对象后    new Father();
                new test();
                new test();  得到一下打印结果:

父类--静态代码块 ①
父类--静态代码块②
子类---静态代码块①
子类---静态代码块②     x=4  y=5
父类--构造代码块 A
父类--构造方法
父类--构造代码块 A
父类--构造方法
子类---构造代码块 a
子类---构造方法
父类--构造代码块 A
父类--构造方法
子类---构造代码块 a
子类---构造方法


去掉get()方法注释后 new test().get();
编译不通过:错误如下
test.java:50:
错误:
找不到符号
                System.out.println("x="+x);
                                        ^
  符号:   变量 x
  位置: 类 test
test.java:51: 错误: 找不到符号
                System.out.println("y="+y);
                                        ^
  符号:   变量 y
  位置: 类 test
2 个错误

结论我就不总结啦!!动手就靠谱了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马