java中子类继承父类,程序运行顺序



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 

子类中主方法

 

========

方法体

======== 

 

父类中非静态代码块

 

=========

构造方法

======== 

父类中构造方法

 

========

无名称方法体

======== 

子类中非静态程序块

 

=========

子类构造方法

======== 

子类中构造方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值