子类继承父类,子类中就拥有父类的所有属性和方法。在创建子类的实例的时候,父类和子类到底是如何执行的呢?还有静态代码块和非静态代码块和构造方法的执行顺序?
1.先执行父类的静态代码块,然后再子类静态代码块
2.父类的非静态代码块,构造方法
3.子类的非静态代码块,构造方法
对象的初始化顺序
静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。
如果父类没有不带参数的构造方法, 那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;
看代码:
package com.zhb.basic;
/**
*子类和父类的关系
* @author Administrator
*
*/
public class Test1 extends superTest1{
public Test1(){
super("xxx");//父类没有无参构造方法,有有参的构造方法,就要显式调用super(参数)
System.out.println("xxxx子类构造方法");
}
public Test1(String name){
super("xxx");//同上
System.out.println("子类类有参构造函数");
}
{
System.out.println("我是子类非静态代码块");
}
{
System.out.println("我是子类非静态代码块2");
}
static{
//当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;
System.out.println("我是子类静态代码块");
}
public static void main(String[] args){
/*Test1 t = new Test1();
char a = 'a' - 32;
char b = Character.toUpperCase('c');
System.out.println(b);
System.out.println(t.testUpperCase("AVVV"));
long x = 222_5555;
System.out.println(x);*/
//子类和父类的关系
Test1 t1 = new Test1("xxx");
}
}
class superTest1{
/*public superTest1(){
System.out.println("suerTest1无参构造方法");
}*/
public superTest1(String name){
System.out.println("父类有参构造函数");
}
{
System.out.println("我是父类类非静态代码块");
}
static{
System.out.println("我是父类静态代码块");
}
public final void cry(){
System.out.println("haha");
}
}
输出:
我是父类静态代码块
我是子类静态代码块
我是父类类非静态代码块
suerTest1构造方法
我是子类非静态代码块
xxxx子类构造方法