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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 悟佛修道 于 2013-5-18 16:38 编辑

class  PersonDemo
{
public static void main(String[] args)
{
  Person p = new Person("zhangsan",20); 毕老师讲到这步没往下面写代码了,特意让我们看下对象的值。


在毕老师讲对象的初始化过程的时候,讲到这步时,毕老师为了让我们看下对象的值,特意编译了persondemo,然后运行了下。打印的结果是null

这一没打印到没问题了,一打印到发现问题了。为什么已经传入了值zhangsan,20  而打印出来却还是堆里初始化的null。不是堆里初始化后,接着就是传入的值去初始化吗?也就是应该是zhangsan 20啊,为什么还是null呢?

唉,感觉这些概念性的问题好混淆。求解,谢谢!

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

6 个回复

倒序浏览
|——第一、
    Person p = new Person("zhangsan",20);
调用了Person类的构造函数,构造方法进栈(持有this对象),赋值完成后,构造方法弹栈
  1. 关于显式初始化的操作:
  2.                                 class Fu{
  3.                                         Fu(){
  4.                                                 show(); //对象会直接调用子类的show方法
  5.                                         }
  6.                                        
  7.                                         void show(){
  8.                                                 System.out.println("Fu show method");
  9.                                         }
  10.                                 }

  11.                                 class Zi extends Fu{
  12.                                         int num = 9;
  13.                                        
  14.                                         {//构造代码块。前边写了
  15.                                                 System.out.println("Constructor init.."+num);
  16.                                                 num = 10;
  17.                                         }
  18.                                         Zi(){       
  19.                                                 super();
  20.                                                 //在super后显式初始化
  21.                                                 //构造代码块初始化
  22.                                                 System.out.println("zi contructor run..."+num);  //num = 0;
  23.                                         }
  24.                                        
  25.                                         void show(){
  26.                                                 System.out.println("zi show run..."+num);//num = 9;
  27.                                         }
  28.                                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
弹栈 。。。。 额
回复 使用道具 举报
可以发下完整的看下
回复 使用道具 举报
对象一被加载就执行构造代码块。
楼主所说的对象创建后,下面这句就被执行了
{
    System.out.println(name+".."+age);
}
因为构造代码块是优先于构造函数执行的,而构造代码块中有个打印操作,所以打印出来的结果就是null。
如果在构造函数中也加上打印操作的话,就会打印对象创建时传入的值了。
Person(String name,int age)
        {
                this.name = name;
                this.age = age;
                   System.out.println(name+".."+age);//如果在这里加上打印的话,就会输出zhangsan和20了,这样就把null的干掉了。
        }
这里主要涉及构造函数和构造代码块的先后问题。
楼主加上打印语句试下就明白了。
要注意的是:如果楼主加上打印的话,打印的结果应该先是null和0,第二个打印就会出现zhangsan和20.

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
神之梦 发表于 2013-5-17 17:18
对象一被加载就执行构造代码块。
楼主所说的对象创建后,下面这句就被执行了
{

哦 原来是这样啊,看来自己没理解透啊。
嘿嘿,又是你啊,谢谢啊!
回复 使用道具 举报
悟佛修道 发表于 2013-5-18 16:38
哦 原来是这样啊,看来自己没理解透啊。
嘿嘿,又是你啊,谢谢啊!

彼此交流嘛,偶也还在看视频中:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马