文档章节

java中子类继承父类程序执行顺序问题

ninjaFrog
 ninjaFrog
发布于 2017/05/04 22:32
字数 692
阅读 20
收藏 0

Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。

public class FatherTest {

    private String name;

 

    FatherTest(){

       System.out.println("--父类的无参构造函数--");

    }

   

    FatherTest(String name){

       this.name=name;

       System.out.println("--父类的有参构造函数--"+this.name);

    }

 

    static{

       System.out.println("--父类的静态代码块--");

    }

   

    {

       System.out.println("--父类的非静态代码块--");

    }

   

    public void speak(){

       System.out.println("--父类的方法--");

    }

   

}

加入一个main程序后

    public static void main(String[] args) {

       System.out.println("--父类主程序--");

      

       FatherTest father=new FatherTest("父亲的名字");

       father.speak();

    }

 

执行结果为:

--父类的静态代码块--

--父类主程序--

--父类的非静态代码块--

--父类的有参构造函数--父亲的名字

--父类的方法--

 

可以很明显的看出来执行顺序:静态代码块—主程序—非静态代码块—构造函数—一般方法。

如果加入子类的继承以后,情况就会变得复杂些。比如我们再新建一个测试子类。

public class SonTest extends FatherTest {

    private String name;

 

    static{

       System.out.println("--子类的静态代码块--");

    }

   

    {

       System.out.println("--子类的非静态代码块--");

    }

   

    SonTest(){

       System.out.println("--子类的无参构造函数--");

    }

   

    SonTest(String name){

       this.name=name;

       System.out.println("--子类的有参构造函数--"+this.name);

    }

   

    @Override

    public void speak(){

       System.out.println("--子类Override了父类的方法--");

    }  

 

}

然后再加入一个main函数

public static void main(String[] args) {

       System.out.println("--子类主程序--");

      

       FatherTest father=new FatherTest("父亲的名字");

       father.speak();

      

       SonTest son=new SonTest("儿子的名字");

       son.speak();

}

执行结果为:

--父类的静态代码块--

--子类的静态代码块--

--子类主程序--

--父类的非静态代码块--

--父类的有参构造函数--父亲的名字

--父类的方法--

--父类的非静态代码块--

--父类的无参构造函数--

--子类的非静态代码块--

--子类的有参构造函数--儿子的名字

--子类Override了父类的方法--

加入了子类以后,执行顺序有了新的变化,我们可以总结一下。

首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。

第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。

第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。

本文转载自:

ninjaFrog

ninjaFrog

粉丝 5
博文 75
码字总数 19425
作品 0
昌平
程序员
私信 提问
Java和Android ClassLoder对比以及Class加载过程

Java的ClassLoder的父子关系如下:Bootstrap--ExtClassClassLoader---AppClassLoader。 JVM启动时先运行启动类加载器Bottstrap,主要加载Java核心API;然后加载扩展类加载器ExtClassLoder,该...

JasmineBen
2018/05/23
0
0
java对象和内存的控制深入浅出

一、对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量)。 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和...

zhoulc
2013/06/18
0
3
Java提高——对象与内存控制

实例变量和类变量 Java内存管理分为两个方面:内存分配和内存回收。 内存分配是特指创建Java对象时,JVM为该对象在堆内存中所分配的内存空间 内存回收是指当Java对象失去引用,变成垃圾时,J...

qq_30604989
2018/04/18
0
0
Java程序员从笨鸟到菜鸟之(三)面向对象之封装,继承,多态(下)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 上接:Java程序员从笨鸟到菜鸟之(二)面向对象之封装,继承,多态(上) 五:再谈继承 继承是一种联结类的层...

长平狐
2012/11/12
106
0
java变量,初始化快,构造函数的执行顺序

对于JAVA中类的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略。当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙。而且现在许多大公司的面试题,对于这方面...

清风傲剑
2014/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部