代码
package text.Base.ExecutionSequence;
class Demo0 {
int a;
String b;
public Demo0(){
System.out.println("Demo0:Argumentless constructor");
}
public Demo0(String b) {
this.b = b;
System.out.println("Demo0:There are parameter constructors");
}
public Demo0(String b, int a){
this.b = b;
this.a = a;
System.out.println("Demo0:There are parameter constructors");
}
{
System.out.println("Demo0:Non-static code blocks");
}
static{
System.out.println("Demo0:Static code blocks");
}
public void sout(){
System.out.println("Demo0:Common method");
}
}
class Demo1 extends Demo0 {
int c;
String d;
public Demo1(){
System.out.println("Demo1:Argumentless constructor");
}
public Demo1(int c) {
this.c = c;
System.out.println("Demo1:There are parameter constructors");
}
public Demo1(int c, String d) {
this.c = c;
this.d = d;
System.out.println("Demo1:There are parameter constructors");
}
{
System.out.println("Demo1:Non-static code blocks");
}
static{
System.out.println("Demo1:Static code blocks");
}
public void sout(){
System.out.println("Demo1:Common metchod");
}
public static void main(String[] args) {
System.out.println("==============Demo0==========");
// Demo0 demo0 = new Demo0();
System.out.println("==============Demo1==========");
Demo1 demo1 = new Demo1();
}
}
运行结果
1.父类静态代码块
2.子类静态代码块
3.父类非静态代码块
4.父类构造函数
5.子类非静态代码块
6.子类构造函数
分析
1.方法区:
mina()方法是一个程序的入口,程序从mian()方法进入,mian()方法被static关键字修饰,存在于方法区,因此程序首先执行的是存在于方法区中的方法、变量等,而其有父类首先执行父类的,再执行子类
2.堆:
程序执行完方法区内的方法、变量等,就会执行非静态代码块,而非静态代码块属于对象,对象存在于堆中,因此在实例化对象的时候首先执行非静态代码块,再执行构造函数。
3.栈
实例化对象的时候实例的出来的对象的引用存在于栈中,通过引用指向堆中的对象,通过引用的方式调用对象的普通方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。