`
zcbbupt
  • 浏览: 58992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java子类与父类的初始化

 
阅读更多
class Parent{
 
           int x=10;
           public Parent(){
                add(2);
           }
           void add(int y){
                x+=y;
           }
     }

     class Child extends Parent{
          int x=9;
         void add(int y){
               x+=y;
          }
          public static void main(String[] args){
               Parent p=new Child();
               System.out.println(p.x);
          } 
     } 

  问输出结果是什么?
     答案应该是10。
     要理解结果为什么是10,需要首先明白下面的知识:
     (1)方法和变量在继承时的隐藏与覆盖
     隐藏:若B隐藏了A的变量或方法,那么B不能访问A被隐藏的变量或方法,但将B转换成A后可以访问A被隐藏的变量或者方法。
     覆盖:若B覆盖了A的变量或者方法,那么不仅B不能访问A被覆盖的变量或者方法,将B转换成A后同样不能访问A被覆盖的变量或者方法。
     (2)Java中变量与方法在继承中的隐藏与覆盖规则:
          一、父类的实例变量和类变量能被子类的同名变量隐藏。
          二、父类的静态方法被子类的同名静态方法隐藏,父类的实例方法被子类的同名实例方法覆盖。
          三、不能用子类的静态方法隐藏父类的实例方法,也不能用子类的实例方法覆盖父类的静态方法,否则编译器会异常。
          四、用final关键字修饰的最终方法不能被覆盖。
          五、变量只能被隐藏不会被覆盖,子类的实例变量可以隐藏父类的类变量,子类的类变量也可以隐藏父类的实例变量。
     在上面的试题中,子类Child的实例方法add(int y)覆盖了父类Parent的实例方法add(int y),而子类的实例变量x则是隐藏了父类的实例变量x。
     Child对象的初始化过程是:
     首先为父类的实例变量x分配内存空间,因为在定义变量x时为它赋了值(int x=10),所以会同时将这个值赋给x。
     其次调用父类的无参构造函数,Parent的构造函数中做的唯一的事情就是调用了add(2);
     第三、由于子类的add(int y)方法覆盖了父类的方法,所以add(2)实际调用的是子类的方法,在子类的add方法中做了如下操作x+=j;在这里由于子类的实例变量x隐藏了父类 的实例变量x,所以这条语句是针对子类本身的,但是这时还没有为子类的实力变量x分配空间,它的默认值是0,加2之后是2。
     第四、父类初始化完毕后接着初始化子类,为子类的x分配内存空间并将它赋值为9,之前的add(2)操作白瞎了。
     再次注意Parent p=new Child();这条语句,它是用父类的引用指向子类的对象,而前面已经说过变量只会被隐藏不会被覆盖,所以这时的p.x值应该是父类的10,而不是子类的9;
     如果将输出语句换成下面的语句结果就是9了:
     System.out..println(((Child)p).x); //首先将p转换成Child类型
原文:http://www.cnblogs.com/binjoo/articles/1585342.html
分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java父类和子类初始化顺序的深入理解

    本篇文章是对java父类和子类初始化顺序进行了详细的分析介绍,需要的朋友参考下

    C++/JAVA/C#子类调用父类函数情况总结

    时间久了就容易记不清了,特留存备用查看 ...—–基类无/有默认构造函数时,在子类构造函数初始化列表处调用,则显示调用 基类类名(参数) class Base { public: Base(int b) : m_b(b) { } private: int m_b

    JAVA经典继承与父类调用 geter、seter访问器 构造器

    代码中设计了各个类的基类,设置私有成员变量,利用构造器对成员变量初始化,用geter、seter访问器设置、获取成员变量的值。继承基类并创建对象,在子类中调用父类方法。

    javase子类父类继承关系图解

    用简单几句话说明java成员初始化顺序,适合初学者

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    子类初始化前,会先加载并初始化它的父类 初始化一个类,其实质上就是执行了()方法 ()方法包含了,静态变量显式赋值代码以及静态代码块 静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先...

    java继承类实例

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

    java三大特性说明

    要求子类当中只有自己特有的方法和属性,其他部分与父类和其他同级子类相同的部分都从父类继承得来.  有关抽象类:  抽象类是用于描述自然界中层级较高的对象类,人们无法对一个抽象类实例化,如动物。只能用一个...

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

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

    常见JAVA基础_4

    子类中的父类成员何时初始化? 4。有CommonEmployee类和Manager类从Employee类继承,它们各包含一个方法getSalary()用于返回各自的薪水,请写一个方法访问所有的Employee类的子类的getSalary()方法。 5。请举一个...

    赛杰IT -java期末测试题 笔试部分

    D) 在类中的构造方法的名字与类的名字相同,而且不能初始化 (6) 循环语句for(int i=0;i;i++){}循环的次数为 。 A)不确定 B)1次 C)3次 D)4次 (7)Java application中的主类需包含main方法,main方法的返回类型是...

    继承中的关键字

    在Java当中的继承是单继承,不允许多继承(class A extends B,C),单继承就是子类只有一个唯一的父类,但是可以多重继承(class A extends B ,class B extends C)。 子类会显式继承父类当中所

    java程序设计阅读程序写结果题22道

    ③用来修饰初始化语句块,这样的语句块常称为静态初始化语句块。static 在这里表示这个方法为类方法,不属于任何对象实例,而是类所有,描述对象的共有动作,可以用类名直接调用。在调用了tripleValue函数之后,函数...

    【04-面向对象(上)】

     但执行一个子类时,最先执行其最顶层父类的静态初始化, •初始化块是属于实例 的。只要创建一次对象,初始化块就执行一次。 下面贴出代码: Dog DogTest Person PersonTest ReturnThis ...

    JAVA基础知识精华总结 收藏

    1、 对象的初始化 (1) 非静态对象的初始化 在创建对象时,对象所在类的所有数据成员会首先进行初始化。 基本类型:int型,初始化为0。 如果为对象:这些对象会按顺序初始化。 ※在所有类成员初始化完成之后,才...

    北航网络教育JAVA语言与面向对象程序设计单选题及答案.doc

    JAVA语言与面向对象程序设计单选题 applet的主要方法 在Java Applet程序用户自定义的Applet子类中,一般需要重载父类的( )方法来完成主类实例的初始化工作。 A.A. start( ) B. B. stop( ) C. C. init( ) D. D. paint...

    java 程序设计 期中考试.doc

    8.静态初始化器是在其所属的类加载内存时由系统自动调用执行. ( √ ) 9.在Java中对象可以赋值,只要使用赋值号(等号)即可,相当于生成了一个各属性与赋值对象相同的新对象. ( × ) 10.只能利用Thread类的...

    Java重写方法与初始化的隐患

     现在我们想随时知道mSuperX是什么值, 不用反射, 因为父类从不直接修改mSuperX的值, 总是通过setX来改, 那么简单的方法是继承SuperClass, 重写setX方法, 监听它的改变好.下面是我们的子类SubC

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    Java程序设计C实验课题(5th)

    编写一个java程序,设计一个汽车类Vehicle,...声明一个父类A,它只有一个非默认构造方法,声明A的子类B,B具有默认构造方法及非默认构造方法,并在B的构造方法中调用基类A的构造方法。编写测试方法生成B的实例并观察结

Global site tag (gtag.js) - Google Analytics