1、

public class FatherTest {

/**
* @param args
*/
private String name;

FatherTest(){
System.out.println("--父类的无参构造器--");
}

FatherTest(String name){
this.name = name;
System.out.println("--父类的有参构造器--" + this.name);
}

static{
System.out.println("--父类的静态代码块--");
}

{
System.out.println("--父类的非静态代码块--");
}

public void speak(){
System.out.println("--父类的普通方法--");
}

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("--父类的主程序--");
FatherTest ft = new FatherTest("父亲的名字");
// FatherTest ft2 = new FatherTest();
ft.speak();
}

}
/**
* --父类的静态代码块--
* --父类的主程序--
* --父类的非静态代码块-
* --父类的有参构造器--父亲的名字
* --父类的普通方法--
* */
// 1、静态代码块 2、主程序 3、非静态代码库 4、构造函数 5、普通方法

结果:

--父类的静态代码块--
--父类的主程序--
--父类的非静态代码块--
--父类的有参构造器--父亲的名字
--父类的普通方法--

2、

package extend;

public class SonTest extends FatherTest {

/**
* @param args
*/
private String name;

static{
System.out.println("子类的静态代码块");
}

{
System.out.println("子类的非静态代码块");
}

SonTest(){
System.out.println("子类的无参构造器");
}

SonTest(String name){
this.name = name;
System.out.println("子类的有参构造器");
}

@Override
public void speak(){
System.out.println("子类的普通方法");
}

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("子类的主程序");
FatherTest ft = new FatherTest("父亲的名字");
ft.speak();
SonTest st = new SonTest("儿子的名字");
st.speak();
/*
首先第一部分执行的是父类的静态代码块--子类的静态代码块--主程序,这部分都是第一次执行
与建立多少对象没有关系
*/
/*
* 第二部分是new了一个父类对象,并调用了方法。执行了他的非静态代码块--构造函数--普通方法
* 第三部分是new了一个子类对象,并调用了方法。执行了父类非静态代码块--父类的无参构造函数
* 然后才是子类的非静态代码块--子类的构造函数--子类的方法
* */
}

}

结果:

--父类的静态代码块--
子类的静态代码块
子类的主程序
--父类的非静态代码块--
--父类的有参构造器--父亲的名字
--父类的普通方法--
--父类的非静态代码块--
--父类的无参构造器--
子类的非静态代码块
子类的有参构造器
子类的普通方法