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

© 回天之力 中级黑马   /  2013-10-21 23:17  /  1418 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-10-22 16:59 编辑

关于静态代码块和默认构造函数有什么不同啊?不都是来初始化类的吗?

评分

参与人数 2技术分 -4 收起 理由
夜默 -5
周志龙 + 1 新手赞一个!

查看全部评分

8 个回复

倒序浏览
静态代码块随着类的加载而执行,只执行一次

评分

参与人数 1技术分 -2 收起 理由
夜默 -2

查看全部评分

回复 使用道具 举报 1 0
Person p = new Person("zhangsan",20);

该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
上面就是实例一个对象初始化的过程,静态代码块就是对加载的类进行初始化,而构造代码块是对实例对象进行初始化

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次
构造代码块:用于给对象初始化,只要建立对象该部分就会被执行,创建一个对象就会执行一次,且优先于构造函数

评分

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

查看全部评分

回复 使用道具 举报

class StaticCode
{
      
        static
        {
                System.out.println("a");
        }//这是静态代码块,存在方法区中,类一加载就执行它里面的内容。是用来给类初始化用的。
        {
                System.out.println("c"+this.num);
        }//这是构造代码块,只要你一创建这个对象这个代码块里面的内容就会执行。创建几个对象它就执行几次

        StaticCode(int x)
        {
                System.out.println("d");
        }//这个是构造函数,没有它对象就创建不了。构造函数和构造代码块差不多。可是说都是给对象初始化用的。但是构造函数假如没写系统会默认加上无参的。
        public static void show()
        {
                System.out.println("show run");
        }//这是静态方法。调用它有两种方式,一种是用类名.show()调用,还有一种是创建对象调用。
}

假如还不理解可以回复我
评分

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个怎么来说呢,因为静态代码块和构造代码块之间没有什么关系。

简单的说一下他俩个的区别吧:

1、静态代码块:它是随着类的的加载而执行,类一加载静态代码块就会执行,并且只执行一次
2、构造代码块:是用于给对象进行初始化,对象一建立,构造代码块就会运行
3、所以静态代码块比构造代码块先执行,构造代码块比构造函数先执行;

用代码解释一下吧:
class StaticCode{
int num=9;
//建立构造函数
StaticCode(){
  System.out.println("b");
}
//下面建立静态代码块
static{
  System.out.println("a");
}
//下面建立构造代码块
{
  System.out.println("c"+this.num);
}
//在建立一个show()
public static void show(){
  System.out.println("show  run");
}
}
class Demo{
public static void main(String[] args){
  new StaticCode();
  
}
}


输出结果:
a
c9
b

看一下这个顺序:先是静态代码块,然后是构造代码块,然后是构造函数,从new StaticCode();可以看出,对象一建立,就迅速执行了这些程序。具体在内存是怎么运行的,和创建对象是差不多的,关键就是执行顺序,掌握好执行顺序就好了。
回复 使用道具 举报 1 0
  1. package com.itheima;

  2. class StaticCode {
  3.         int num = 9;

  4.         // 建立构造函数
  5.         StaticCode() {
  6.                 System.out.println("StaticCode(){} is run");
  7.         }

  8.         // 下面建立静态代码块
  9.         static {
  10.                 System.out.println("static{} is run");
  11.         }
  12.         // 下面建立构造代码块
  13.         {
  14.                 //System.out.println("c" + num);
  15.                 System.out.println("{} is run");
  16.         }

  17.         // 在建立一个show()
  18.         public static void show() {
  19.                 System.out.println("show  run");
  20.         }
  21. }

  22. class Demo {
  23.         public static void main(String[] args) {
  24.                 new StaticCode();

  25.         }
  26. }
复制代码
运行结果:
static{} is run
{} is run
StaticCode(){} is run

主要是搞明白:静态代码块,构造代码块,构造函数的执行顺序和作用。
先是静态代码块,然后是构造代码块,然后是构造函数

静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次
构造代码块:用于给对象初始化,只要建立对象该部分就会被执行,创建一个对象就会执行一次,且优先于构造函数
构造函数:没有它对象就创建不了。构造函数和构造代码块差不多。可是说都是给对象初始化用的。但是构造函数假如没写系统会默认加上无参的。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马