对静态代码块以及构造函数的执行先后顺序,一直很迷惑,看了孙伟琴老师的《java面向对象编程》又结合毕老师的java基础视频中的讲解,现用下面的这段小程序来简明扼要的叙述一下,以加深理解,与君共勉....
public class Fu {
static {
System.out.print(1);
}
public Fu() {
System.out.print(2);
}
}
public class Zi extends Fu {
static {
System.out.print("a");
}
public Zi() {
System.out.print("b");
}
}
public class demo {
public static void main(String[] args) {
Fu fu = new Zi();
fu = new Zi();
}
}
1.
当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:
父类静态代码块 > 子类静态代码块 java虚拟机加载类时,就会执行该块代码。
父类构造函数 > 子类构造函数 (先有父亲,后有孩子)
如果是多级继承关系的话,高层的父类首先执行,然后依次递减
总结:静态优先执行,父类优先于子类执行
静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次
2.
在调用类中的方法时,在方法体执行之前,首先要对类中的成员变量进行赋值,如果代码中没有赋具体的值,就会赋予变量默认值。成员变量的赋值顺序按照前后顺序进行。如果代码中既有直接赋值,也有构造方法赋值,那么根据先后顺序执行
3.
重写(Override) 重载(Overload)
重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们 看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法
重写,子类重新实现父类中的方法;
1. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
2. 子类抛出的异常不能超过父类相应的方法抛出的异常
3. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)
4.
动态绑定思想:在运行时环境中,当通过子类B调用一系列的实例方法(包括一个方法调用另一个方法),将优先和B类本身包含的实例方法动态绑定,如果B类没有定义这个实例方法,才会与从父类继承来的实例方法动态绑定。
看了上面的说明,大家也应该知道上面的程序输出结果了。
输出结果为:1a2b2b
//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。
1 普通代码块
1 //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
2 public class CodeBlock01{
3 public static void main(String[] args){
4
5 {
6 int x=3;
7 System.out.println("1,普通代码块内的变量x="+x);
8 }
9
10 int x=1;
11 System.out.println("主方法内的变量x="+x);
12
13 {
14 int y=7;
15 System.out.println("2,普通代码块内的变量y="+y);
16 }
17 }
18 }
19
20 /*
21 运行结果:
22 1,普通代码块内的变量x=3
23 主方法内的变量x=1
24 2,普通代码块内的变量y=7
25 */
26
2 构造代码块
//构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
public class CodeBlock02{
{
System.out.println("第一代码块");
}
public CodeBlock02(){
System.out.println("构造方法");
}
{
System.out.println("第二构造块");
}
public static void main(String[] args){
new CodeBlock02();
new CodeBlock02();
new CodeBlock02();
}
}
/*
*
执行结果:
第一代码块
第二构造块
构造方法
第一代码块
第二构造块
构造方法
第一代码块
第二构造块
构造方法
*/
3 静态代码块
//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
//如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
//注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
class Code{
{
System.out.println("Code的构造块");
}
static{
System.out.println("Code的静态代码块");
}
public Code(){
System.out.println("Code的构造方法");
}
}
public class CodeBlock03{
{
System.out.println("CodeBlock03的构造块");
}
static{
System.out.println("CodeBlock03的静态代码块");
}
public CodeBlock03(){
System.out.println("CodeBlock03的构造方法");
}
public static void main(String[] args){
System.out.println("CodeBlock03的主方法");
new Code();
new Code();
new CodeBlock03();
new CodeBlock03();
}
}
/*
CodeBlock03的静态代码块
CodeBlock03的主方法
Code的静态代码块
Code的构造块
Code的构造方法
Code的构造块
Code的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法
*/