java中子类继承父类,程序运行顺序的深入分析

2016-02-19 09:22 10 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的java中子类继承父类,程序运行顺序的深入分析,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

我们经常在项目中使用继承,但是往往不太明白,程序运行的顺序以及原理,尤其是使用上转型对象的时候,以及父类子类中都有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  :子类主方法
========方法体======== :父类中非静态代码块
=========构造方法======== :父类构造方法
========无名称方法体======== :子类中非静态代码块
=========子类构造方法======== :子类构造方法
========子类测试方法========= :子类测试方法

执行顺序: 父类静态变量以及静态程序块 --- 子类的静态变量以及静态程序块 --- 父类非静态代码块 --- 父类中构造方法 --- 子类中非静态代码块 --- 子类中构造方法 --- 接下来才是 对象调用的方
法。
只要是用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 子类中主方法
========方法体========  父类中非静态代码块
=========构造方法======== 父类中构造方法
========无名称方法体======== 子类中非静态程序块
=========子类构造方法======== 子类中构造方法
========子类测试方法========= 对象具体调用的方法
------------------------- 静态变量以及程序块只执行一次
========方法体======== 父类中非静态代码块
=========构造方法======== 父类中构造方法
========无名称方法体======== 子类中非静态代码块
=========子类构造方法======== 子类中构造方法
========子类测试方法=========

如果将子类主方法 中更改为:
代码如下:

TestStatic  ts = new TestStatic ();// 运用父类构造方法创建
ts.test();
输出为:
========静态程序块====== 父类静态程序块
========子类静态程序块====== 子类静态程序块
========方法体========  父类非静态程序块
=========构造方法======== 父类构造方法
========测试方法========= 父类具体方法test()
如果将上述代码放到父类中,就不会加载子类 静态程序块了。

通过上面 我们还可以发现,静态程序块运行 是在主方法之前,非静态程序块运行是在主方法之后。
我在父类中 主方法中创建一个对象 调用test(),运行的结果:
========静态程序块====== 静态代码块
===main==
========方法体======== 非静态代码块
=========构造方法======== 构造方法
========测试方法=========

总结:
程序运行时(一个类中),会第一时间加载运行静态代码块,一旦创建对象,就会执行非静态代码块以及无参构造方法。 而在继承中,程序运行时 会先加载父类中静态代码块 然后加载本身静态代码块,一旦创建对象(运用子类构造方法创建),就会调用 父类非静态代码块,父类构造方法,然后就是本身 非静态代码块,本身构造方法。

来源:http://www.tulaoshi.com/n/20160219/1590562.html

延伸阅读
原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组。 实现代码如下所示 代码如下: import java.util.LinkedHashMap; import java.util.Map; public class LRUCache {  public static class CachedData {   private Object data = null;   private long time = 0;   private boole...
通常我们为了更好的缓解服务器压力,和增强搜索引擎的友好面,都将文章内容生成静态页面。 但是有时为了能实时的显示一些信息,或者还想运用动态脚本解决一些问题,不能用静态的方式来展示网站内容,必须用到动态页面显示。 这样以来,就损失了对搜索引擎的友好面,怎么样在两者之间找个中间方法呢,如何增强你网站中地址的可读性和让搜索引擎...
一个朋友的项目里用到了fusionchart,同时需要提供多个报表的word下载功能。 毫无疑问,只是一个很棘手的问题。 fusionchart提供了服务端和客户端生成图片的功能,都是基于client端展示了flash以后做的。 朋友的项目是基于linux的,office本身的那套com机制是没办法通过jacob调用了。 纯java的操作word,POI和docx4j,可以生成word文档,ta...
一.regex(正则表达式):RegularExpressions(代替了StringTokenizer);字符串处理利器;在unix流行,perl使用regex更牛。 主要用在字符串匹配、查找和替换。例如:匹配IP(范围小于256)使用正则很好搞;从网页中揪出大量email地址发送垃圾邮件;从网页里揪出链接。包含Matcher(用模式匹配字符串后产生的结果)和pattern。 代码如下: &n...
点击上传按钮后,webwork的程序流如下: step 1)进入ServletDispatcher.service public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { ........ request = wrapRequest(request); ......... } step2)进入ServletDispatcher.wrapRequest protect...

经验教程

59

收藏

58
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部