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 ...
随机推荐
- Tomcat(免安装版)的安装与配置【转】
1.下载 到Apache的官方网站,我们可以很容易找到Tomcat的下载地址,如: http://tomcat.apache.org/download-60.cgi 在这里我们可以下载到Tomcat的 ...
- azkaban使用--邮件发送配置
前置条件:你的服务器是可以连外网. 当任务是异步定时的,我们对于结果的感知往往没有手动跑脚本那么及时,但是如果任何一个任务运行失败可能都会引起一些列问题,在这个情况下消息通知就很重要了,azkaban ...
- DO,DTO和VO的使用
DO,DTO和VO的使用 DO:对应数据库表结构 VO:一般用于前端展示使用 DTO:用于数据传递.(接口入参和接口返回值都可以) 以ssm框架为例: controller层: public List ...
- --- rk3399/3288 系列平台接mipi 的dts 数据 panel-init-sequence = [] 命令的整法
https://blog.csdn.net/Shushan1/article/details/87858434 mipi 屏的数据手册 dts sample: &dsi { status = ...
- 没有upcast 也不会发生多态
class A{ public: virtual void f(){ cout << "A::f()"<<endl;} }; class B:public ...
- Java运行时数据区域分析
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...
- inpu控件接受pipe的处理结果
input控件绑定的变量,要接受用户的输入值,一般只要使用 [(ngModel)] 就可以. 但是,pipe处理结果如何反映到变量里去呢?不知道吧?嘿嘿 这样就可以了 : <input ...
- 剑指offer——二叉树的镜像
题目:操作给定的二叉树,将其变换为源二叉树的镜像. 思路:前序(根左右的顺序)遍历一棵树,在存储的时候将其左右树进行交换,最后按照处理后的树还原,即得到其镜像. /** public class Tr ...
- lnmp之Nginx配置https加密访问
配置lnmp之Nginx网站支持https加密访问 注: 1. 这里拿购买的(pxsnx.pxjy.com)证书来做样例 证书文件共有三个---> (pxsnxg.pxjy.com_ca.crt ...
- Linux seq_printf输出内容不完整的问题
Linux seq_printf输出内容不完整的问题 写在前面的话:这是多年前在项目中遇到的问题,作为博客的开篇之作,有不足之处,请各位大侠斧正!谢谢! seq_file接口介绍 有许多种方法能够实现 ...