java
中子类继承父类,程序运行顺序
我们经常在项目中使用继承,
但是往往不太明白,
程序运行的顺序以及原理,
尤其
是使用上转型对象的时候,以及父类子类中都有
static
变量和方法时,不知道先运行谁。
我也是写了一个例子。总结了一下。
父类:
public
class
TestStatic {
public
static
String
name
="china";
{
System.
out
.println("========
方法体
========");
}
static
{
name
="England";
System.
out
.println("========
静态程序块
======");
}
TestStatic(){
System.
out
.println("=========
构造方法
========");
}
public
static
void
main(String[] args){
System.
out
.println("========
主方法
========"+
name
);
}
public
void
test(){
System.
out
.println("========
测试方法
=========");
}
}
子类:
public
class
TestExtendStatic
extends
TestStatic{
//public static String name="HUBEI";
{
System.
out
.println("========
无名称方法体
========");
}
static
{
//name="SUIZHOU";
System.
out
.println("========
子类静态程序块
======");
}
TestExtendStatic(){
System.
out
.println("=========
子类构造方法
========");
}
public
void
test(){
System.
out
.println("========
子类测试方法
=========");
}
public
static
void
main(String[] args){
System.
out
.println("========
子类主方法
========"+
name
);
TestStatic
ts =
new
TestExtendStatic();//
上转型对象
ts.test();
}
}
输出如下:
========
静态程序块
======
:父类
static
程序块
========
子类静态程序块
======
:子类
static
程序块
【不是静态方法】
========
子类主方法
========England
:子类主方法
========
方法体
========
:父类中非静态代码块
=========
构造方法
========
:父类构造方法
========
无名称方法体
========
:子类中非静态代码块
=========
子类构造方法
========
:子类构造方法
========
子类测试方法
=========
:子类测试方法
(
1
)
执行函数体之前就要执行的代码顺序
:
父类静态变量以及静
态程序块
---
子类的静态变量以及静态程序块
(
2
)
创建对象时执行顺序
:
父类非静态变量及无法调用的代码块
---
父类中对应构造方法
---
子类非静态变量及无法调用的代码块
---
子类中对应构造方法
只要是用
new
创建对象,分配了内存空间,不管是将引用赋给上转型对象,还是赋给子类
对象,上面方法都必须执行。
即:
TestStatic
ts =
new
TestExtendStatic();//
上转型对象
TestExtendStatic ts =
new
TestExtendStatic();//
子类对象
上面加粗程序都会执行。
上面程序中
ts.test();
ts
作为上转型对象调用的是
子类继承的父类中的方法,因为
test
()在子类中被重写了,所以输出的为子类中的语句。
如果将子类中
main
方法该成如下:
public
static
void
main(String[] args){
System.
out
.println("========
子类主方法
========"+
name
);
TestStatic
ts =
new
TestExtendStatic();
ts.test();
System.
out
.println("-------------------------");
ts =
new
TestExtendStatic();
ts.test();
}
输出:
========
静态程序块
======
父类中静态程序块
========
子类静态程序块
======
子类中静态程序块
========
子类主方法
========England
子类中主方法
========
方法体
========
父类中非静态代码块
=========
构造方法
========
父类中构造方法
========
无名称方法体
========
子类中非静态程序块
=========
子类构造方法
========
子类中构造方法
java
中子类继承父类,程序运行顺序
我们经常在项目中使用继承,
但是往往不太明白,
程序运行的顺序以及原理,
尤其
是使用上转型对象的时候,以及父类子类中都有
static
变量和方法时,不知道先运行谁。
我也是写了一个例子。总结了一下。
父类:
public
class
TestStatic {
public
static
String
name
="china";
{
System.
out
.println("========
方法体
========");
}
static
{
name
="England";
System.
out
.println("========
静态程序块
======");
}
TestStatic(){
System.
out
.println("=========
构造方法
========");
}
public
static
void
main(String[] args){
System.
out
.println("========
主方法
========"+
name
);
}
public
void
test(){
System.
out
.println("========
测试方法
=========");
}
}
子类:
public
class
TestExtendStatic
extends
TestStatic{
//public static String name="HUBEI";
{
System.
out
.println("========
无名称方法体
========");
}
static
{
//name="SUIZHOU";
System.
out
.println("========
子类静态程序块
======");
}
TestExtendStatic(){
System.
out
.println("=========
子类构造方法
========");
}
public
void
test(){
System.
out
.println("========
子类测试方法
=========");
}
public
static
void
main(String[] args){
System.
out
.println("========
子类主方法
========"+
name
);
TestStatic
ts =
new
TestExtendStatic();//
上转型对象
ts.test();
}
}
输出如下:
========
静态程序块
======
:父类
static
程序块
========
子类静态程序块
======
:子类
static
程序块
【不是静态方法】
========
子类主方法
========England
:子类主方法
========
方法体
========
:父类中非静态代码块
=========
构造方法
========
:父类构造方法
========
无名称方法体
========
:子类中非静态代码块
=========
子类构造方法
========
:子类构造方法
========
子类测试方法
=========
:子类测试方法
(
1
)
执行函数体之前就要执行的代码顺序
:
父类静态变量以及静
态程序块
---
子类的静态变量以及静态程序块
(
2
)
创建对象时执行顺序
:
父类非静态变量及无法调用的代码块
---
父类中对应构造方法
---
子类非静态变量及无法调用的代码块
---
子类中对应构造方法
只要是用
new
创建对象,分配了内存空间,不管是将引用赋给上转型对象,还是赋给子类
对象,上面方法都必须执行。
即:
TestStatic
ts =
new
TestExtendStatic();//
上转型对象
TestExtendStatic ts =
new
TestExtendStatic();//
子类对象
上面加粗程序都会执行。
上面程序中
ts.test();
ts
作为上转型对象调用的是
子类继承的父类中的方法,因为
test
()在子类中被重写了,所以输出的为子类中的语句。
如果将子类中
main
方法该成如下:
public
static
void
main(String[] args){
System.
out
.println("========
子类主方法
========"+
name
);
TestStatic
ts =
new
TestExtendStatic();
ts.test();
System.
out
.println("-------------------------");
ts =
new
TestExtendStatic();
ts.test();
}
输出:
========
静态程序块
======
父类中静态程序块
========
子类静态程序块
======
子类中静态程序块
========
子类主方法
========England
子类中主方法
========
方法体
========
父类中非静态代码块
=========
构造方法
========
父类中构造方法
========
无名称方法体
========
子类中非静态程序块
=========
子类构造方法
========
子类中构造方法