Static方法,与子类父类的执行顺序
来源:互联网 发布:sql 删除重复记录 编辑:程序博客网 时间:2024/06/06 02:05
今天遇到了一些问题, 刚开始很混乱。后来一个一个的查,一个一个问题的去解决,现在豁然开朗了。记录一下:
起因是因为看一个帖子看到这样一段代码:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public
class
Test {
Person person =
new
Person(
"Test"
);
static
{
System.out.println(
"test static"
);
}
public
Test() {
System.out.println(
"test constructor"
);
}
public
static
void
main(String[] args) {
new
MyClass();
}
}
class
Person{
static
{
System.out.println(
"person static"
);
}
public
Person(String str) {
System.out.println(
"person "
+str);
}
}
class
MyClass
extends
Test {
Person person =
new
Person(
"MyClass"
);
static
{
System.out.println(
"myclass static"
);
}
public
MyClass() {
System.out.println(
"myclass constructor"
);
}
}
输出结果为:
test staticmyclass static
person static
person Test
test constructor
person MyClass
myclass constructor
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一开始看到结果的时候想不通为什么是这样子的,跟我想的一点都不一样啊。 费了半天劲儿都看不出来这样的结果,觉得自己真的是太欠缺了,懂的太少了。后来静下心研究了一下,慢慢来,不要急躁,会学到很多东西。
首先,我将自己的疑问列出来:
1.静态方法的初始化
2. new 一个子类的时候,父类构造是如何被调用的;
3.main方法与成员变量及方法的执行顺序。
首先解决第一个问题,静态方法的初始化,静态方法是被static修饰的方法,一般静态方法会在类被加载的时候就进行初始化, 而且只初始化这一次。所以你看到的输出结果,static是在最前面的。
第二个问题,new一个子类的时候,有static变量跟方法会先初始化。然后会先去加载父类的成员变量,方法, 与构造函数,如果父类中存在static方法或者变量,则先初始化static变量与方法,但是记住,static方法与变量只能被初始化一次,如果前面初始化过就不会再初始化第二次了。接下来就是初始化成员变量,然后调用构造函数。
第三个问题,程序开始运行时,系统会找到main方法所在的class,然后把main方法加载到内存中,从mian 函数的第一条开始执行,知道main的最后一条语句结束。但是class中存在static变量或者方法,也会进行初始化。所以这里输出的第一条是test static。 至于main所在的类中其他的成员变量喝构造函数只会在new 这个类时进行初始化,方法要在调用的时候才加载。
好了,现在我们来捋一捋。接下来在new MyClass
()的时候,先执行static方法,输出myclass static。因为MyClass
继承自Test,所以会先出初始化Test,而Test类在系统执行main之前就被加载了,也就是说Test类中的static方法已经被初始化过了,在这里就不会再进行二次初始化。接下来就初始化成员变量person,person是通过new Person()被初始化的,new Person() 会按照同样的顺序对Person类中的静态方法,成员变量,构造函数进行初始化。 所以,首先输出静态方法中的person static,然后调用构造函数,输出person Test。 person初始化完成之后就执行Test类的构造函数,输出test constructor。 然后在返回子类进行初始化,初始化成员变量 person (static已经被初始化过,不会再次进行初始化),同样到person类中执行构造函数(static已经被初始化过,不会再次进行初始化),输出person MyClass,然后执行myClass的构造函数,输出myclass constructor。
现在,清晰很多了吧。 所以 静态方法与main的执行关系是,静态方法与属性> main 方法, 子类初始化会先加载父类的变量跟方法,注意这里只是加载并不会创建一个父类对象。
- Static方法,与子类父类的执行顺序
- 子类和父类的 static块 和 构造方法 构造块 的执行顺序
- 父类与子类的执行顺序
- 子类与父类构造方法执行顺序
- 类继承中子类static成员方法与父类static成员方法调用顺序浅析
- 子类继承父类中的static模块、构造方法执行顺序及java多态性
- 详细讲解方法重写的注意事项,子类与父类代码的执行顺序
- 子类extends父类方法执行顺序
- 子类、父类各种方法的执行顺序
- 子类、父类各种方法的执行顺序
- 项目中遇到的子类父类方法执行顺序
- 子类、父类各种方法的执行顺序
- asp.net 页面父类与子类方法执行的顺序
- 父类与子类的静态代码块、代码块、构造方法执行顺序
- static,构造函数,子类,父类执行顺序
- static,构造函数,子类,父类执行顺序
- static,构造函数,子类,父类执行顺序
- static,构造函数,子类,父类执行顺序
- poj 2887 big string (块状链表)
- BS通信,服务器代码模拟
- hdoj 4686 Arc of Dream(矩阵快速幂)
- 粒子系统
- Android之Handler的postDelayed()方法的用法
- Static方法,与子类父类的执行顺序
- Kotlin-抽象类和接口
- video.min.js做视频播放
- Android网络篇
- 对于ViewPage设置transform参数的说明
- Linux基础
- python 教程
- JAVA设计模式之初识
- 欧拉工程第一题 找出1000以下的自然数中,属于3和5的倍数的数字之和。