黑马程序员技术交流社区

标题: 继承的一点疑惑 [打印本页]

作者: 顾传文    时间: 2013-3-5 21:36
标题: 继承的一点疑惑
本帖最后由 顾传文 于 2013-3-12 09:11 编辑

package com.itheima;
public  class Test01 {
     public static void main(String[] args) {
           Zi zi = new Zi(3);
          System.out.println(zi.getNum());
      }
}
class Fu{
      private int num;
      int age;
      public Fu(int num){
          this.num = num;
          age = 60;
      }
      public int getNum(){
          return num;
      }
}
class Zi extends Fu{
      private int num = 6;
      public Zi(int num){
           super(num);
      }
}
打印的结果为3。记得子类不能继承父类的private类型的属性和方法,为什么打印的结果不是6呢?
作者: 肖明凯    时间: 2013-3-5 21:46
  1. package com.itheima;
  2. public  class Test01 {
  3.      public static void main(String[] args) {
  4.            Zi zi = new Zi(3);
  5.           System.out.println(zi.getNum());[color=Red]//子类中并没有getNum方法,所以这里只能调用父类的getNum方法并输出父类的成员变量,[/color]
  6.       }                                   [color=Red]//当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量。[/color]
  7. }
  8. class Fu{
  9.       private int num;
  10.       int age;
  11.       public Fu(int num){
  12.           this.num = num;
  13.           age = 60;
  14.       }
  15.       public int getNum(){
  16.           return num;
  17.       }
  18. }
  19. class Zi extends Fu{
  20.       private int num = 6;
  21.       public Zi(int num){
  22.            super(num);
  23.       }
  24. }
复制代码

作者: HM王琦    时间: 2013-3-5 21:59
package com.itheima;
public  class Test01 {
     public static void main(String[] args) {
           Zi zi = new Zi(3);//此处的3传递给Zi类构造函数中的num;
                   //Zi zi=new Zi(3);相当于把3赋值给了Zi类的成员变量num;原来初始值是6;
          System.out.println(zi.getNum());//所以打印的是3;
      }
}
class Fu{
      private int num;
      int age;
      public Fu(int num){
          this.num = num;
          age = 60;
      }
      public int getNum(){
          return num;
      }
}
class Zi extends Fu{
      private int num = 6;//这里num是成员变量初始值为6;
      public Zi(int num){
           super(num);//调用父类的构造方法this.num=num;
      }
}

作者: 谢洋    时间: 2013-3-5 22:24
本帖最后由 谢洋 于 2013-3-5 22:26 编辑

new Zi(3);其实在堆内存中会产生两个对象:子类对象和父类对象,而父类对象又属于子类对象的一部分,为什么?
先看一下子类初始化的过程就明白为什么?
1、调用子类构造时,子类的构造先去调用父类的构造(这时就产生了一个父类对象),等返回后再执行自身的构造,这时子类对象也生产了,但这个父类对象不是独立的,他属于子类的一部分;
2、实际,子父类并不发生实质的复盖,只是在调用子类成员时,产生了跟复盖一样的效果已而,
正如上面的,不管num被什么饰,堆内存中都会有两个num;
作者: amen0205    时间: 2013-3-5 22:27
  1. package com.itheima;
  2. public  class Test01 {
  3.      public static void main(String[] args) {
  4.            Zi zi = new Zi(3);
  5.           System.out.println(zi.getNum());
  6.       }
  7. }
  8. class Fu{
  9.       private int num;
  10.       int age;
  11.       public Fu(int num){
  12.           this.num = num;//把3  赋值给num,原来的值6被修改了 此时num为3 <font color="#ff0000"> 第三步</font>
  13.           age = 60;
  14.       }
  15.       public int getNum(){
  16.           return num;
  17.       }
  18. }
  19. class Zi extends Fu{
  20.       private int num = 6;  //创建子类对象时这步先于构造函数执行,此时 num=6;<font color="#ff0000">第一步</font>
  21.       public Zi(int num){
  22.            super(num);//调用父类构造函数  <font color="#ff0000">第二部</font>
  23.       }
  24. }
复制代码
   这是对象的实例化过程。希望对你有帮助





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2