`
syab11
  • 浏览: 199561 次
  • 性别: Icon_minigender_1
  • 来自: SH
社区版块
存档分类
最新评论

Java继承时的初始化过程分析

    博客分类:
  • java
阅读更多
Java继承时的初始化过程:
1. 父类对象内存分配
2. 父类字段默认初始化
3. 子类对象内存分配
4. 子类字段默认初始化
5. 进入父类构造-> 父类成员显示初始化(定义字段时设置的字段初值)
            -> 执行父类构造体(此时可以调用抽象方法,所有父类字段已初始
            化完毕,但子类字段尚未进行显示初始化)
6. 进入子类构造-> 子类成员显示初始化(定义字段时设置的字段初值)
          -> 执行子类构造体(此时所有字段已经显示初始化)

package com.jwh.cn;

public class ExtendsRun extends HelloWorld{
    public int i=1;
    public ExtendsRun() {
        super();
        System.out.println("hello world");
        System.out.println(this+"2");  
    }
    
    public static void main(String[] args) {
        ExtendsRun er = new ExtendsRun();
    }
    @Override
public String toString() {

return super.toString();   //第一种情况
//        return new Integer(i).toString();  //第二种情况
           }
}

class HelloWorld{
    public int i=2;
    public HelloWorld() {
        System.out.println("Hello World");
        System.out.println(this+"1");  //this在此相当于this.toString(),是一个父类的应用,指向子类的对象
    }
    
    @Override
    public String toString() {
        return new Integer(i).toString();
    }
    
    public int getI() {
        return i;
    }
    
    public void setI(int i) {
        this.i = i;
    }
}

第一种输出结果为
Hello World
21
hello world
22

第二种情况下输出的居然是
Hello World
01
hello world
12


分析过程:
1, 程序充main进入程序后先对对父类和子类的属性默认赋值,int默认为0,此时super.i=0 this.i=0
2, 然后进入父类的构造函数 ,对父类的属性显示赋值,此时super.i=2
3, 打印”this+”1””   注意:this是父类的一个引用,指向子类的对象,相当于是this.toString(),调用子类的toString()
4, 第一种情况:运行子类的toString(),调用父类的toString(),得到换回值为super.2,打印21
第二种情况:运行子类的toString(),换回子类的i值,此时子类i值还没有显性赋值,所以为0,打印为01
5, 进入子类的构造函数,对子类的属性显性赋值,此时this.i=1
6, 第一种情况:运行子类的toString(),调用父类的toString(),得到换回值为super.2,打印22
第二种情况:运行子类的toString(),换回子类的i值,此时子类i值已经显性赋值,所以为1,打印为12。





分享到:
评论

相关推荐

    Java类继承初始化顺序

    具体内容见博客

    java面试题-类的初始化顺序.doc

    java面试题-类的初始化顺序.doc 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,...

    java继承类实例

    自己设计的一个程序,展现有继承结构的子类对象的初始化过程(包含构造方法、初始化值、父类构造方法、父类的初始化值的环节)

    Java类继承关系中的初始化顺序实例详解

    主要介绍了Java类继承关系中的初始化顺序,结合实例形式详细对比分析了Java非继承关系中的初始化与继承关系中的初始化相关原理与操作技巧,需要的朋友可以参考下

    Java类初始化顺序

    所有代码块是从上往下顺序执行的,所以代码块里面使用到的变量如果在块下面初始化会有问题 执行构造方法中内容。 所以看见的空构造方法,只能说第三部没有需要执行的内容。 下面举例子 public class TestClass { ...

    Java关于含有继承类的成员初始化过程讲解

    今天小编就为大家分享一篇Java关于含有继承类的成员初始化过程讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Java初始化顺序

    1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println(Sample默认构造函数被调用); } } class Test{ static Sample sam=new...

    《java面向对象程序设计-继承和多态》教案.doc

    圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰...

    java 构造器的调用

    java 构造器初始化成员变量 是否提供默认构造器 继承中构造器的调用

    java面试题静态加载顺序构造方法

    Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。

    JAVA类的定义及继承演示

    一个构造方法,无参数,在此构造方法中初始化dogName,dogAge 说明二:关于SmallDog 继承Dog,不添加任何属性和方法 最后,在测试类中的main方法中生成SmallDog类的对象,访问属性dogName和dogAge,并打印出他们的值...

    Java开发者文档,分享日常学习的一些小知识点 .rar

     2、继承时,对象的初始化过程  (1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。  (2) 主类静态成员的初始化。  (3) 主类的超类由高到低进行默认构造方法的调用。注意,在调用每一...

    JAVA程序设计实验

    (2) 定义一个Student类,其中包括学号、姓名、性别、出生年月等属性以及init( )——初始化各属性、display( )——显示各属性、modify( )¬——修改姓名等方法。实现并测试这个类。 (3) 从上题的Student类中派...

    JAVA面试题解惑系列

    JAVA面试题解惑系列(一)——类的初始化顺序 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行...

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    java数组初始化笔试题-yvm:[yvm]低性能垃圾回收jvm

    java数组初始化笔试题 | | | | | 这是一个用 C++ 编写的自制 Java 虚拟机,它支持大多数 Java 语言功能,并包含一个基于标记清除的并发垃圾收集器。 此 VM 的主要组件符合 . 它是可运行的,各种语言功能将逐步添加到...

    Java中关于字符串的若干问题分析.pdf

    通过用不同的方法对字符串初始化,结合反编译分析,得到初始化方法对...的初始化方法对程序的影响、相等比较以及 String 类与 Strin gBuffer 类的区别三个方面做了系统分析,期望能够对 Java 歇 息提供一些参考和借鉴。

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    稳稳当当学java之继承(10)

    本人的笔记,关于java基础中继承的内容 包括 1.作业回顾 2.成员变量的初始值 3.对象初始化 4.继承 5.子类对象的实例化过程 6.继承的规则一 7.练习

    java学习笔记-java思维导图流程图表格整理

    三种初始化 25 静态初始化 26 动态初始化 26 默认初始化 26 数组的四个基本特点 27 二维数组 27 Arrays类 28 稀疏数组 29 面向对象编程 32 值传递和引用传递 33 创建和初始化对象 34 封装 34 继承 37 super 37 方法...

Global site tag (gtag.js) - Google Analytics