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

摘要:
publicclassSonTestextendsFatherTest{privateStringname;static{System.out.println;}{System.out.println;}SonTest(){System.out.println;}SonTest{this.name=name;System.out.println;}@Overridepublicvoidspeak(){System.out.println;}}然后再加入一个main函数publicstaticvoidmain{System.out.println;FatherTestfather=newFatherTest;father.speak();SonTestson=newSonTest;son.speak();}执行结果为:--父类的静态代码块----子类的静态代码块----子类主程序----父类的非静态代码块----父类的有参构造函数--父亲的名字--父类的方法----父类的非静态代码块----父类的无参构造函数----子类的非静态代码块----子类的有参构造函数--儿子的名字--子类Override了父类的方法--加入了子类以后,执行顺序有了新的变化,我们可以总结一下。

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

publicclassFatherTest {

privateString name;

FatherTest(){

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

}

FatherTest(String name){

this.name=name;

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

}

static{

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

}

{

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

}

publicvoidspeak(){

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

}

}

加入一个main程序后

publicstaticvoidmain(String[] args) {

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

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

father.speak();

}

执行结果为:

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

--父类主程序--

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

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

--父类的方法—

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

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

publicclassSonTestextendsFatherTest {

privateString name;

static{

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

}

{

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

}

SonTest(){

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

}

SonTest(String name){

this.name=name;

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

}

@Override

publicvoidspeak(){

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

}

}

然后再加入一个main函数

publicstaticvoidmain(String[] args) {

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

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

father.speak();

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

son.speak();

}

执行结果为:

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

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

--子类主程序--

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

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

--父类的方法--

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

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

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

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

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

加入了子类以后,执行顺序有了新的变化,我们可以总结一下。首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。

免责声明:文章转载自《java中子类继承父类程序执行顺序问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RxJava入门WordPress in Windows And Uncaught Error: Call to undefined function mysql_connect()下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC编程入门之二十(常用控件:静态文本框)

  上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了。从本节开始将讲解各种常用控件的用法。常用控件主要包括:静态文本框、编辑框、单选按钮、复选框、分组框、列表框、组合框、图片控件、列表控件、树形控件和进度条控件等等。本节先来讲解静态文本框的使用。   控件的通知消息   在讲静态文本框的使用之前,先大概讲讲控件的通知消息。   ...

python 多重继承构造函数调用顺序

实例代码 class Person(object): def __init__(self, name, age): self.name = name self.age = age print("父类构造函数") def talk(self): print("person...

new几种用法

在 C# 中,new 关键字可用作运算符、修饰符或约束。 new 运算符 用于创建对象和调用构造函数。 new 修饰符 用于向基类成员隐藏继承成员。 new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。 new 修饰符(C# 参考) 在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员意味着该成员的派生版本将替换基类版本。...

用windbg分析一个dead lock的问题

难得Winform项目中碰到dead lock,记录一下。 QA报告说,有时候晚上跑完自动化脚本,第二天早上来发现系统hang在屏保界面没反应,从日志看也没有报错。这种属于很少才会发生,也不知道怎么重现,但是很严重的bug,于是抓个dump来研究一下。 # Windbg加载dump文件后的一些文件信息 Microsoft (R) Windows Debu...

SQLite安装和调用

  想把项目的SQL SERVER数据库换掉,因为SQL SERVER过于庞大,而我的项目只是小型的桌面应用程序。   网上搜了一下,发现了SQLite,真是个好东西,无需安装和部署,关键是客户电脑什么都不用装就能使用数据库,大小只有1M多,正是我想要的。   花了半天时间,把项目的数据库替换掉,SQL语句基本都能用,只修改了个别语句。把SQLite的用法...

静态文件cdn自解析生成相对路径

一、场景和目标:用户上传一个包含 index.html 的静态资源压缩包,资源内所有文件都是相互依赖的,不需要用户对内部文件内容做任何特殊处理,仅通过服务端逻辑处理达到用户访问 http://xxx.xxx/guid/index.html 时就可以得到这个资源的所有数据并正常浏览。 二、技术:nodejs、expressnpm 包:decompress、r...