Java中子类对象初始化的过程
Java中的继承机制看似简单,实际上包含了很多细节。最近在刷题过程中屡屡跳坑,于是自己仔细再学习了一下Java中子类初始化的细节,与大家分享。
class Father
{
Father(){};
}
class Child extends Father
{
super(); //隐式地调用父类构造函数,对父类进行初始化
int age = 10;
Child(){};
}
以以上代码为例:
若执行Child child = new Child();
(1)首先对子类变量进行初始化(int age=0);
(2)执行子类Child构造函数中的隐式super(),调用父类构造函数对父类进行初始化;
(3)执行子类Child构造函数中的其余部分,对子类进行初始化;
(4)对子类变量进行初始化(child.age = 10)
下面我们用一个例子,结合多态来详细说明该初始化过程:
class Father
{
Father()
{
show();
}
void show()
{
System.out.println("father");
}
} class Child extends Father
{
int age = 9;
Child()
{
//隐式super();
System.out.println("child"+age);
}
void show()
{
System.out.println("show"+age);
}
} public class ChuShiHua
{
public static void main(String[] args)
{
Father child = new Child();
}
}
(1)执行Child child = new Child();时:首先默认初始化child.age = 0;(int类的默认初始化值为0)
(2)执行Child类的构造器,首先执行其中的隐式super(),于是执行父类Father的构造器,执行函数体中的show()’
(3)因为多态机制,子类中也有show(),所以执行子类中的show(),输出show0
(4)父类初始化完毕,接着对子类中的变量赋值(child.age=9)
(5)接着执行子类构造器中的语句,输出child9
所以最后的输出是:
show0
child9
在分析此类问题时要特别注意子类在执行构造器时会先执行一个隐式的super()
这意味着子类调用构造器时要先执行父类的无参数构造器对父类进行初始化,如果父类没有无参构造器,则会出现如下编译错误:

Java中子类对象初始化的过程的更多相关文章
- Java中子类对象赋值给父类变量
1. 在Java中将一个字类对象赋值给父类变量是合法的,这也是实现多态(即方法的动态分派)的前提条件之一. 2. 在Java中父类赋值同样也适用于数组.可以将一个子类数组赋值给一个父类数组变量.但可能 ...
- Java类与对象初始化的过程(一道经典的面试题)
本文不再以ClassLoader的视角解释这些问题. 首先,Java代码有个特点,就是成员变量可以在前面的方法中使用,在后面定义.这一特性,很多人说Java了不起,可是为什么呢?Java为何能够这样呢 ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- 【Java基础】Java中new对象的过程
序言 联系我上次写的关于Java内存的文章,对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈.Java 堆.方法区这三个最重要内存区域之间的关联 ...
- java 子类对象实例化的过程
大家往往听说 子类继承了父类就有了父类中的所有的非私有的属性,但是怎么就有了父类的属性了呢 ?且听下面分解 子类对象实例化的过程: 1 从结果上来看:(继承性) 子类继承了父类以后 就获取了父类中声 ...
- JAVA 对象初始化的过程
对象初始化的过程例:Student S = new Student();1.因为new Student()用到了Student类,所以会把它从硬盘上加载进入内存2.如果有static静态代 ...
- JAVA中JavaBean对象之间属性拷贝的方法
JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...
- JAVA中子类会不会继承父类的构造方法
声明:刚刚接触java不久,如果理解有错误或偏差望各位大佬强势批判 java中子类能继承父类的构造方法吗? 父类代码: class Father { String name ; //就不set/get ...
- java中子类与基类变量间的赋值
Java中子类与基类变量间的赋值 子类对象可以直接赋给基类变量. 基类对象要赋给子类对象变量,必须执行类型转换, 其语法是: 子类对象变量=(子类名)基类对象名; 也不能乱转换.如果类型转换失败Jav ...
随机推荐
- 关于c# Debug和Release的区别 (转)
关于Debug和Release的区别之讨论本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别2. 哪些情况下 Release 版会出错2. 怎样“调试” Release ...
- leetcode966
class Solution(object): def spellchecker(self, wordlist: 'List[str]', queries: 'List[str]') -> 'L ...
- 37_redux_理解
1.什么是Redux Redux是JavaScript状态容器(是JS库,不是react插件),提供可预测化的状态管理. 可以用在react.angular.vue等项目中,但基本与react配合使用 ...
- kettle使用笔记1--基本安装和使用
参考来源 https://blog.csdn.net/qq_36698956/article/details/80751655,在这个文章基础上实际使用增加的. 一,安装,采用的是下载官方网站的win ...
- 洛谷P3655 差分数组 树状数组
题目链接:https://www.luogu.org/problemnew/show/P3655 不一定对,仅供参考,不喜勿喷,不喜勿喷. 先copy洛谷P3368 [模板]树状数组 2 题解里面一位 ...
- java中java.exe,javac 在editplus中的配置
java.exe,javac设置快捷键(editplus) 1.tools-preferences 2.add tools---program java关键字
- CentOS7更改运行级别
Step 1:查看系统默认运行级别 [root@node-1 html]# systemctl get-default //图形界面graphical.target [root@node- ...
- easyUI添加修改tab页(toolbar)
代码: <div id="editdialos" class="easyui-dialog" title="虚机配置修改" data- ...
- systemd 编写服务管理脚本---学习
转载:https://www.cnblogs.com/sparkdev/p/8521812.html 我们运行 linux 服务器的主要目的是通过运行程序提供服务,比如 mysql.web serve ...
- JAVA EE 环境配置——JAVA8 下载安装和 Eclipse EE的下载安装
说明:我的电脑是win10 64位操作系统 步骤1:下载Java8 浏览器输入www.oracle.com,点击 Downloads,选择 Java ,选择 Java (JDK) for Develo ...