黑马程序员技术交流社区
标题:
关于静态初始化快
[打印本页]
作者:
lovecx24
时间:
2013-11-30 21:51
标题:
关于静态初始化快
class Parent {
public static String p_StaticField = "父类--静态变量";
public String p_Field = "父类--变量";
// 下面这些是干什么的?解释以下,不是很明白
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 下面这是干什么的?不明白?为什么这么写
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
public Parent() {
System.out.println("父类--构造器");
}
}
public class SubClass extends Parent {
public static String s_StaticField = "子类--静态变量";
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
public SubClass() {
System.out.println("子类--构造器");
}
public static void main(String[] args) {
new Parent();
System.out.println("-------------------");
new SubClass();
System.out.println("-------------------");
new SubClass();
}
}
复制代码
程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
不明白为什么是这样的结果?把详细的执行过程讲下好吗?
作者:
王东旭
时间:
2013-11-30 21:57
我说下吧,建立子类对象时,执行顺序为,父类静态代码块,子类静态代码块,父类代码块,父类构造函数,子类代码块,子类构造函数
作者:
清风星明
时间:
2013-11-30 22:48
新手来回答下吧,如有错误,恳请指正。我觉得首先有两个类Parent、SubClass,其中SubClass继承了Parent,所以SubClass也继承了Parent的成员变量和方法,其中也包括静态的。在Parent类中,static {....}是一个静态块,用于初始化,即执行静态块中的代码。然后执行static下面的输出语句属于代码块,以及定义的构造函数。同理,SubClass类中也是同样结构。最后是执行阶段:执行main函数,执行顺序为父类静态块-子类静态块-父类代码块-父类构造函数-子类代码块-子类构造函数。此外,值得注意的是,静态块只执行一次,即第一次访问时,所以得到结果的第一部分。随后的两部分只执行Parent、SubClass的代码块和构造函数,所以后两次的结果一样。
作者:
胡陈思
时间:
2013-12-1 11:33
这个结果好长,我先介绍下代码块,有三种代码块:
静态代码块-随类的加载而加载,而且只会执行一次,你创建多少对象都与它无关,只执行一次
构造代码块-对对象初始化
局部代码块-控制变量的生命周期
我想你不理解的是代码块的执行顺序:静态代码块>构造代码块>局部代码块--(构造方法里方法体那部分就是局部代码块)
还有一点,子类继承父类,在子类创建对象时要调用子类的构造方法,而每个子类的构造方法中都有一个super()方法,
这个super()方法调用父类的 无参构造方法 ,所以创建子类对象的顺序是:
父类构造方法-子类构造方法
因为有了静态代码块和构造代码块的出现
父类的静态代码块-父构造代码块-父类构造方法-子类的静态代码块-子构造代码块-子类构造方法
作者:
陪你等日出
时间:
2013-12-1 11:35
呵呵!回答下楼主代码中的问题:
static{
}
复制代码
静态代码块的作用:给类进行初始化,随着类的加载而执行,只执行一次,是优先于主函数执行的。
{
}
复制代码
构造代码块的作用:给对象进行初始化,它和构造函数是有区别的,构造函数
只是给对应的对象初始化,而构造代码块是给所有的对象初始化,里面定义的是
不同对象共性的初始化内容。
执行顺序楼上的同学已经说了,我就不写了
作者:
高正新
时间:
2013-12-1 13:52
静态初始化块、初始化块、构造方法这三个概念的执行顺序是固定的,你需要记住它的。
根据程序的不同需要去写在不同的地方
作者:
L_t
时间:
2013-12-1 14:42
静态属性优先级大于非静态属性,静态方法包括静态块的优先级大于非静态方法包括构造函数,在子类和父类中的执行编译顺序为由上至下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2