黑马程序员技术交流社区

标题: new对象后什么时候才会得到传入的值? [打印本页]

作者: 悟佛修道    时间: 2013-5-17 16:08
标题: new对象后什么时候才会得到传入的值?
本帖最后由 悟佛修道 于 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呢?

唉,感觉这些概念性的问题好混淆。求解,谢谢!
作者: Super_Class    时间: 2013-5-17 16:15
|——第一、
    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.                                 }
复制代码

作者: 逸盏清茶    时间: 2013-5-17 16:20
弹栈 。。。。 额
作者: 8047107    时间: 2013-5-17 16:31
可以发下完整的看下
作者: 神之梦    时间: 2013-5-17 17:18
对象一被加载就执行构造代码块。
楼主所说的对象创建后,下面这句就被执行了
{
    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.
作者: 悟佛修道    时间: 2013-5-18 16:38
神之梦 发表于 2013-5-17 17:18
对象一被加载就执行构造代码块。
楼主所说的对象创建后,下面这句就被执行了
{

哦 原来是这样啊,看来自己没理解透啊。
嘿嘿,又是你啊,谢谢啊!
作者: 神之梦    时间: 2013-5-18 17:32
悟佛修道 发表于 2013-5-18 16:38
哦 原来是这样啊,看来自己没理解透啊。
嘿嘿,又是你啊,谢谢啊!

彼此交流嘛,偶也还在看视频中:handshake




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