Java 继承 执行顺序
代码:
package com.company;public class Main {public static void main(String[] args) {new MyClass();} }class Test {Person person = new Person("Test");static{System.out.println("test static");}public Test() {System.out.println("test constructor");} }class Person{static{System.out.println("person static");}public Person(String str) {System.out.println("person "+str);} }class MyClass extends Test {Person person = new Person("MyClass");static{System.out.println("myclass static");}public MyClass() {System.out.println("myclass constructor");} }
结果:
test static myclass static person static person Test test constructor person MyClass myclass constructor
========================================================
默认构造函数与有参数构造函数
代码:
public class Main {public static void main(String[] args) {new Child("mike");}} class People {String name;public People() {System.out.print(1);}public People(String name) {System.out.print(2);this.name = name;} }class Child extends People {People father;public Child(String name) {//super(name);System.out.print(3);this.name = name;father = new People(name + ":F");}public Child() {System.out.print(4);} }
结果:
132
View Code
考察的又是父类与子类的构造函数调用次序。在Java中,子类的构造过程中必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但如果父类有多个构造函数时,该如何选择调用呢?
第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super(); 这样就会调用父类没有参数的构造方法。
第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。
总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。
如果取消注释中的代码,那么结果就是232
==========================================================================================
代码:
public class Main {public static void main(String[] args) {new Dervied();}}class Dervied extends Base {private String name = "dervied";public Dervied() {tellName();printName();}public void tellName() {System.out.println("Dervied tell name: " + name);}public void printName() {System.out.println("Dervied print name: " + name);} }class Base {private String name = "base";public Base() {tellName();printName();}public void tellName() {System.out.println("Base tell name: " + name);}public void printName() {System.out.println("Base print name: " + name);} }
结果:
Dervied tell name: null Dervied print name: null Dervied tell name: dervied Dervied print name: dervied
View Code
原因:
1、首先private是不会继承到新的对象里,所以不会出现“base”。
2、由于重写的缘故,在执行super的构造函数是,还是调用的子类方法,此时成员变量未初始化。
https://www.cnblogs.com/sylz/p/5758990.html
Java 继承 执行顺序相关推荐
- java 继承执行顺序
java 中 继承的 执行 顺序 public class A {public A(){System.out.println("A 无参");}public A(int a){Sy ...
- Java中继承执行顺序
目录 继承执行顺序 类中的资源分类: 在子类中创建main方法 在无关类中创建main方法 拓展 代码块 权限修饰符 继承执行顺序 类中的资源分类: 静态成员变量, 静态代码块, 静态方法, 非静态成 ...
- Java代码执行顺序
Java代码执行顺序 1. Java初步认知 2. Javayun.java例子 3. 反编译Javayun.class文件 4. 分析Javayun_dxdump文件 5. 再来一个网上的例子Jav ...
- java继承执行子类输出顺序_JAVA继承顺序
当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执行的呢,也就是说我们需要关 ...
- Java构造函数执行顺序
首先执行基类的构造函数 然后执行派生类的构造函数之外的初始化语句 最后执行派生类的构造函数 在Java中,如果派生类构造函数需要调用基类的构造函数,那么基类构造函数必须作为派生类构造函数的第一句话.在 ...
- java程序执行顺序
一直都常听同学们和老师们讲过一些关于java程序中的一些执行流程和执行顺序,从来也没自己系统的总结过.今天突来兴趣,总结一下,也算给自己做了学校笔记. 一.首先在了解程序的一些加载顺序流程开始前,首先 ...
- java for 执行顺序_java – @BeforeMethod和继承 – 执行顺序(TestNG)
If I have class A and a class B extends A and both have one @BeforeMethod method, then will the pare ...
- java 继承先后顺序_Java中的继承关系的加载顺序
/* 在加载类时,Java虚拟机先加载父类再加载子类,再对静态初始化块. 静态成员变量(类变量).静态方法进行一次初始化. 只有调用new方法时才会创建类的对象.按照父子继承关系进行初始化, 首先执行 ...
- Java类加载执行顺序
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化. 一.加载 加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建j ...
最新文章
- 开源应用架构之​Selenium WebDriver讲解
- seaborn系列 (4) | 分类图catplot()
- 10进制与16进制之间的转换 delphi
- date oracle 显示毫秒_oracle数据库to_date日期格式化到毫秒 | 学步园
- AJAX的安全性及AJAX安全隐患
- java排序方法调用_Java实现顺序查找、二分查找、冒泡排序、方法调用
- 元宵节电商促销首页设计PSD分层模板
- aix查看文件夹大小命令_轻松掌握 Linux 命令(1):ls 命令
- c# 取余数 浮点数_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源
- 论文阅读:Natural Language Processing Advancements By Deep Learning: A Survey
- 几个知识蒸馏相关的BERT变体
- Hamcrest 精萃
- 苹果id登陆不上去怎么回事_shopee虾皮台湾站 app怎么登陆不上去,shopee虾皮台湾站app最新版...
- iphone邮件服务器 263,在iphone上怎么设置263邮箱
- Python小白的数学建模课-21.关键路径法
- 微信小程序之——实现一行滑动显示很多文字-scroll-view
- 为什么每个人都该知道阿兰·图灵?
- IBM AppScan 安全扫描报告中部分问题的解决办法
- 西门子s7—200smart型PLC和昆仑通泰触摸屏程序
- android shap,Android中Shape的用法详解
热门文章
- 车联网系统会不会只是智能手机系统的翻版?
- 工业4.0进行时:未来协作方式的变革
- 深度学习综述:Hinton、Yann LeCun和Bengio经典重读
- 中国倒数第五!毕马威全球自动驾驶报告|附下载
- 未来智能实验室成立,建设世界第一个智能系统智商评测和趋势研究机构
- 程序员的“凡尔赛文学”大赏!
- 单行文字垂直/水平跑马灯效果
- WCF 设计和实现服务协定(01)
- 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀
- 小米 Play 发布:CPU+GPU 双 Turbo,每个月送 10 GB 流量