A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾传文 中级黑马   /  2013-3-5 21:36  /  1902 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾传文 于 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呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
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;
      }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 谢洋 于 2013-3-5 22:26 编辑

new Zi(3);其实在堆内存中会产生两个对象:子类对象和父类对象,而父类对象又属于子类对象的一部分,为什么?
先看一下子类初始化的过程就明白为什么?
1、调用子类构造时,子类的构造先去调用父类的构造(这时就产生了一个父类对象),等返回后再执行自身的构造,这时子类对象也生产了,但这个父类对象不是独立的,他属于子类的一部分;
2、实际,子父类并不发生实质的复盖,只是在调用子类成员时,产生了跟复盖一样的效果已而,
正如上面的,不管num被什么饰,堆内存中都会有两个num;
回复 使用道具 举报
  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. }
复制代码
  • 因为new用到了Person.class文件,所以会先找到它并加载到内存中。
  • 执行该类中静态代码块,给Person.class初始化。
  • 在堆内存中开辟空间,分配内存地址。
  • 在对内存中建立对象的特有属性,并进行默认初始化。
  • 对属性显示初始化。
  • 对对象进行构造代码块初始化。
  • 对对象进行对应的构造函数初始化。
  • 将内存地址赋给栈内存中的变量。
   这是对象的实例化过程。希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马