`
helloJ
  • 浏览: 166558 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

提问:这道继承题输出什么,大家看题目给答案,不准编译!

    博客分类:
  • java
阅读更多
class Depend
{
    int i = 10;
    public Depend()
    {
        print();
        i = 20;
    }

    void print()
    {
        System.out.println("Depend=> " + i);
    }
}


public class Qdb extends Depend
{
    int i = 30;
    public Qdb()
    {
        print();
        super.print();
        i = 40;
    }

    void print()
    {
        System.out.println("Target=> " + i);
    }

    public static void main(String[] args)
    {
        new Qdb();
    }
}

 

 

 

 

 

 

 

回答:

初始化顺序是:

父类成员变量,父类构造函数,子类成员变量,子类构造函数

 

我们顺着初始化的顺序来说


首先程序从main方法开始执行,new Qdb(),这句话就是要new一个Qdb的对象,根据对象初始化的顺序,初始化子类之前必须要初始化父类,所以此时一系列的调用开始了


      1,调用Qdb的父类Depend类的构造函数,在调用构造函数之前,成员变量是先于构造函数初始化的,这个时候Depend里面的i已经有值了,它的值就是10,在Depend构造函数里面,我们看到的第一句是:print方法,这个print方法我们要注意,它在Depend的子类也定义了,并且此次初始化是由子类Qdb发起的,所以实际上这个print方法调用的是Qdb里面定义的print,而这个时候有意思的事情就出现了,此时子类还没有出生呢,因为这个时候父类才正在构造之中,所以子类中此时的i还是0,而print正好打印出的是子类的i,所以第一次输出是0;


      2,父类调用完子类的print后,把父类的i赋了值20,此时父类已经完全被构造出来了,马上就要开始构造子类了.
     

      3,同理,在调用子类的构造函数之前,子类的i被赋了初值30,然后进入子类的构造函数,此时调用的也是print,这个就非常好理解了,这个print肯定是子类自己的print方法了,此时i已经构造好,当然,此时输出的值是30;

      4,下一句super.print(),这句话显示的调用了父类的print方法,而此时父类的i已经在父类的构造函数里面改为20了,所以此次调用输出20.


      5,然后再把子类的i的值设为50.

在以上过程中,如果掌握好了类的初始化顺序,是比较容易知道输出结果的.还有一点要记住,JAVA里面的方法是动态绑定的,而成员却是静态绑定的.父类里面调用的print之所以会输出0,就是因为print实际上调用的是子类的print,因为整个这场调用都是由new Qdb()这句话产生的.

 

摘自:http://topic.csdn.net/u/20080619/19/924c55b0-5919-46ad-8bf0-0c6425020253.html?seed=1780906883

 

 

 

执行顺序的理解:

class Depend
{
    int i = 10;
    //1.调用父类构造函数
    public Depend()
    {
    	//2.调用了子类的print()方法,父类i = 10
    	print();
    	//4.此处父类i 赋值为 20
        i = 20;
    }

    //8.由第4步知父类i = 20
    void print()
    {
        System.out.println("Depend=> " + i);
    }
}


public class Qdb extends Depend
{
    int i = 30;
    public Qdb()
    {
    	//5.调用子类print()方法,子类 i = 30;
        print();
        //7.显示调用父类print()方法
        super.print();
        //9.此处子类i 赋值为 40
        i = 40;
    }

    void print()
    {
    	//3. 子类i已经被声明为int(默认值为0),未赋值
    	//6. 子类i已经被赋值为 30
        System.out.println("Target=> " + i);
    }

    public static void main(String[] args)
    {
        new Qdb();
    }
}


这里对第3步不理解,如果说i已经被int i = 30;声明为int,为什么还没赋值呢?

如果没被声明,又为什么会输出 0 呢?

难道说,子类成员变量的声明在父类构造函数之前,而赋值在父类构造函数之后?

 

分享到:
评论
3 楼 mercyblitz 2008-06-25  
引用
是不是说,子类成员变量的声明在父类构造函数之前,而赋值在父类构造函数之后?


是的,子类的变量和父类变量在不同的区域,子类对象首先要构造父类对象(然后让super去引用)
2 楼 helloJ 2008-06-23  
引用

在父类构造的时候, 调用print()方法时,调用的是子类的print()方法,而当时子类的i并没有赋值,所以是默认值为0(primitive类型 int 是0 ,boolean 是 false等等),
所以打印是0.


恩,是这样的,只是不明白

是不是说,子类成员变量的声明在父类构造函数之前,而赋值在父类构造函数之后?

不然,子类在掉用print()方法时,如果 i 没被申明,那么肯定 会报错,而不是输出 0 吧
1 楼 mercyblitz 2008-06-20  
为什么是0?

回答:

  在父类构造的时候, 调用print()方法时,调用的是子类的print()方法,而当时子类的i并没有赋值,所以是默认值为0(primitive类型 int 是0 ,boolean 是 false等等),
所以打印是0.

相关推荐

    编译原理课后习题答案

    ### 编译原理课后习题答案解析 #### 第1章 引论 **知识点解析:** 1. **编译程序:** - 定义:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 - 功能:编译...

    编译原理试题及答案\编译原理考试试题及答案

    在“编译原理试题及答案\编译原理考试试题及答案”这个资料包中,我们可以预见到一系列与编译原理相关的考试题目和解答,这对于学习者来说是一份宝贵的资源。以下是一些可能涵盖的知识点: 1. **词法分析**:这是...

    编译原理试题汇总+编译原理期末试题(8套含答案+大题集)

    ### 编译原理知识点解析 #### 一、基础知识与概念 **编译程序的基本组成**: - **词法分析**:负责将源程序文本分割成一个个有意义的单元,即单词或标识符。 - **语法分析**:根据词法分析的结果,按照一定的语法...

    编译原理第三版课后习题答案

    《编译原理第三版》是计算机科学领域的一本经典教材,涵盖了编译器设计的核心理论和技术。这本书的课后习题旨在帮助读者深入理解和掌握编译器构建的各个环节。以下是对压缩包中各章节课后答案的详细解读: 第一章 ...

    《编译原理教程》(胡元义)课后习题答案

    这本书的第三版课后习题答案对于学习者深入理解编译原理及其应用至关重要。 编译原理涉及的主要知识点包括: 1. **词法分析**:这是编译器的第一步,也称为扫描或词法分解。它将源代码中的字符流分解成一个个有...

    编译原理_龙书习题答案

    编译原理是计算机科学与技术领域的一个重要分支,主要研究如何将源代码转换为机器可以理解和执行的代码。《编译原理》一书,即被广泛称为“龙书”的教材,由Alfred V. Aho和Monahan共同编著,其深入浅出地讲解了...

    陈意云 版编译原理作业课后习题答案

    《陈意云版编译原理作业课后习题答案》是一个综合性的学习资源,主要针对的是计算机科学领域中的核心课程——编译原理。这门课程是理解和开发编程语言的关键,涵盖了词法分析、语法分析、语义分析以及代码生成等多个...

    【最全】编译原理期末试题大全及答案

    编译原理是计算机科学领域的一门重要基础学科,它主要研究将高级程序设计语言翻译成计算机能直接执行的机器语言的过程。以下内容将详细解读编译原理中的各个知识点: 一、编译过程的基本概念 编译过程一般可以分为...

    编译原理-龙书-习题答案

    编译原理-龙书-习题答案,word版。内容举例: 第二章部分习题答案 2.1 考虑文法 S→ S S + | S S * | a 证明文法可生成符号串 a a + a * 解:S→ S S * → S S + S * →a S + S * → a a + S *→ a a + a * 为此...

    编译原理(陈意云 张昱)习题参考答案

    ### 编译原理知识点解析 #### 一、正规表达式与描述的语言 1. **正规表达式的理解**: - 正规表达式是用于描述形式语言的一种工具,它可以用来定义一组字符串,这些字符串满足一定的模式。 - 正规表达式通常用于...

    编译原理课后答案

    11. **属性文法**:非终结符可以有继承属性和综合属性,这是编译器设计中的一个高级话题,判断题第3题提出了这个概念。 12. **逆波兰表示法与括号**:逆波兰表示法通过消除括号简化了表达式的表示,判断题第4题说明...

    编译原理答案 李文生

    ### 编译原理知识点解析 #### 一、编译程序的结构与功能 **1.1 编译程序的组成部分及功能** 编译程序通常被划分为六个主要部分,每个部分都有其特定的功能: - **词法分析**:词法分析器负责扫描源程序,根据...

    编译原理习题答案&;;龙书第二版中文

    《编译原理习题答案——龙书第二版中文》涵盖了编译器设计的重要概念和实践应用,这是一份详尽的解答集,旨在帮助学习者深入理解和掌握编译原理的知识。"龙书"通常指的是Alfred V. Aho、Monica S. Lam、Ravi Sethi和...

    计算机编译原理 张幸儿 第三版课后习题答案

    计算机编译原理是计算机科学领域中的一个重要组成部分,它主要研究如何将高级编程语言转换为机器可执行的指令。张幸儿主编的《计算机编译原理》第三版是该领域的经典教材,提供了深入浅出的理论讲解和丰富的实践案例...

    清华编译原理第三版答案

    针对这本教材,名为《清华编译原理第三版答案》的解答集应运而生。这本解答集不仅包含了对教材中各个章节习题的详细解答,更针对教材配套的练习题提供了全面的指导。这些习题和解答集,对于那些希望在编译原理这一...

    编译原理教材(清华大学版)答案

    清华大学版《编译原理》教材的答案涵盖了大量的实际案例和练习,这对于理论学习和实践操作都大有裨益。通过深入学习和反复实践,学习者不仅可以掌握编译器设计的基本原理,还能培养解决实际问题的能力,为未来从事...

    现代编译原理(虎书)课后答案

    《现代编译原理》(通常被称为“虎书”),是由著名计算机科学家Alfred V. Aho、Monica S. Lam、Ravi Sethi和Jeffrey D. Ullman合著的经典教材,它深入浅出地介绍了编译器设计的各个方面。这本书是许多计算机科学...

    编译原理课后答案---WORD版

    "编译原理课后答案"这个压缩包文件很可能包含了针对教材中习题的详细解答,这些解答可以帮助学生检验自己的理解,解决在做题过程中遇到的问题。 首先,我们需要理解编译器的基本组成部分。编译器通常由以下几个阶段...

    编译原理答案(编译原理及编译程序构造)

    编译原理答案 本资源摘要信息将对编译原理的基本概念进行详细的解释,并以编译程序的逻辑部分为主线,涵盖了编译过程的五个阶段和编译程序的七个逻辑组成部分。 首先,让我们从编译原理的基本概念开始。源程序是指...

    编译原理第二版答案(全)

    《编译原理第二版答案(全)》是一个包含详尽解答的资源,主要针对学习编译原理这门课程的学生或教师。编译原理是计算机科学领域的重要学科,它研究如何将高级编程语言转换为机器可执行的低级代码。这份Word文档资料...

Global site tag (gtag.js) - Google Analytics