黑马程序员技术交流社区
标题:
代码块问题
[打印本页]
作者:
回天之力
时间:
2013-10-21 23:17
标题:
代码块问题
本帖最后由 杨增坤 于 2013-10-22 16:59 编辑
关于静态代码块和默认构造函数有什么不同啊?不都是来初始化类的吗?
作者:
马晓平
时间:
2013-10-21 23:19
静态代码块随着类的加载而执行,只执行一次
作者:
张文豪
时间:
2013-10-22 10:14
Person p = new Person("zhangsan",20);
该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
上面就是实例一个对象初始化的过程,静态代码块就是对加载的类进行初始化,而构造代码块是对实例对象进行初始化
作者:
李文帅
时间:
2013-10-22 10:17
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次
构造代码块:用于给对象初始化,只要建立对象该部分就会被执行,创建一个对象就会执行一次,且优先于构造函数
作者:
wenbaoxing
时间:
2013-10-22 10:26
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()调用,还有一种是创建对象调用。
}
假如还不理解可以回复我
评分
作者:
wenbaoxing
时间:
2013-10-22 10:30
这个怎么来说呢,因为静态代码块和构造代码块之间没有什么关系。
简单的说一下他俩个的区别吧:
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();可以看出,对象一建立,就迅速执行了这些程序。具体在内存是怎么运行的,和创建对象是差不多的,关键就是执行顺序,掌握好执行顺序就好了。
作者:
wenbaoxing
时间:
2013-10-22 10:51
package com.itheima;
class StaticCode {
int num = 9;
// 建立构造函数
StaticCode() {
System.out.println("StaticCode(){} is run");
}
// 下面建立静态代码块
static {
System.out.println("static{} is run");
}
// 下面建立构造代码块
{
//System.out.println("c" + num);
System.out.println("{} is run");
}
// 在建立一个show()
public static void show() {
System.out.println("show run");
}
}
class Demo {
public static void main(String[] args) {
new StaticCode();
}
}
复制代码
运行结果:
static{} is run
{} is run
StaticCode(){} is run
主要是搞明白:静态代码块,构造代码块,构造函数的执行顺序和作用。
先是静态代码块,然后是构造代码块,然后是构造函数
静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次
构造代码块:用于给对象初始化,只要建立对象该部分就会被执行,创建一个对象就会执行一次,且优先于构造函数
构造函数:没有它对象就创建不了。构造函数和构造代码块差不多。可是说都是给对象初始化用的。但是构造函数假如没写系统会默认加上无参的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2