黑马程序员技术交流社区

标题: 构造方法的调用问题 [打印本页]

作者: m529031854    时间: 2014-5-30 11:52
标题: 构造方法的调用问题
  1. package com.zhujl.test1.zhujl;

  2. public class MethodOverload {
  3. public static void main(String[] args) {
  4.         MethodDemo1 md = new MethodDemo1();
  5. }
  6. }
  7. class MethodDemo1{
  8.         String name;
  9.         String age;
  10.         public MethodDemo1(){
  11.                 System.out.println(1);
  12.         }
  13.        
  14.         public MethodDemo1(String name,String age){
  15.                 this();//调用指定的构造方法
  16.                 this.name=name;
  17.                 this.age=age;
  18.                
  19.                 System.out.println(2);
  20.         }
  21.         public MethodDemo1(String name){
  22.                
  23.                 this(name,age);//调用指定的构造方法(此处是错的,报错:不能引用实例字段的年龄而显式调用构造函数)
  24.                 this.name=name;
  25.                 this.age=age;
  26.                 System.out.println(3);
  27.         }
  28. /*问题:
  29. * 如果想在一个构造方法中
  30.         调用另外一个构造方法,那么可以使用 this()的方式调用,this()
  31.         括号中的参数表示目标构造方法的参数。this()必须要作为构
  32.         造方法的第一条语句,换句话说,this()之前不能有任何可执
  33.         行的代码
  34. * 一 为什么我那样调用行呢?
  35. * 二 把全局变量 改成静态的 就可以啦 为什么?
  36. *
  37. */
  38.        
  39. }
复制代码

谢谢!!!
作者: More    时间: 2014-5-30 12:28
构造函数的第一句话默认是super();也就是默认调用父类的无参数构造器,你这个这样调用到底想实现什么??
作者: 饥渴ing    时间: 2014-5-30 13:30
类变量是类加载时就存在栈中的所以构造方法可以调用,而成员变量是new后才存在堆中的。你都没存在怎么可能让你使用
作者: 不似侽紸角.    时间: 2014-5-30 15:56
public MethodDemo1(String name){  /*注意,这里你的构造方法中并没有age这个变量,所以没办法给给age初始化,所以会报错,因为如果 你创建了这个对象 MethodDemo1 md = new MethodDemo1("张三");age是没有值,更别说调用了。但静态会现在加载进内存就可以*/

23.               

24.                this(name,age);//调用指定的构造方法(此处是错的,报错:不能引用实例字段的年龄而显式调用构造函数)

25.                this.name=name;

26.                this.age=age;

27.                System.out.println(3);

作者: 田富丰    时间: 2014-5-30 23:31
  1. public MethodDemo1(String name){
  2.                
  3.                 this(name,age);//这个age是对象的,当你用这个构造时,这个对象没有对age进行初始化,
  4.                                       //所以程序不知道你这个age是什么?你把这个age变成static,这个age就是类的成员了,所以没问题!!不过不知道你这为什么要调用这个双参的构造方法!!
  5.                 this.name=name;
  6.                 this.age=age;
  7.                 System.out.println(3);
  8.         }
复制代码

作者: hamiguadjs    时间: 2014-5-31 01:23
在创建对象的时候,会调用构造方法,而方法是在对象调用的时候才会在内存中,调用完成后,方法就会释放,而创建的对象的成员变量存放在堆中,两者的生命周期不同,所以声明是static,就会使得成员变量的声明周期加长,从而使得方法能正常的使用。
作者: 提菩--空    时间: 2014-5-31 02:02
public MethodDemo1(String name){
               
                this(name,age);//调用指定的构造方法(此处是错的,报错:不能引用实例字段的年龄而显式调用构造函数)
                this.name=name;
                this.age=age;
                System.out.println(3);
        }
只是当把age变成静态后,静态的age会先于public MethodDemo1(String name)构造函数运行,静态变量优先于构造方法初始化,和声明周期长短没有关系。所以当程序新建一个只带name参数的对象调用public MethodDemo1(String name)构造函数时,this(name,age)中的age已先初始过了,就会顺利执行下去。而不声明为static,因为age没有初始化就会报错。自己的一点见解,供楼主参考。




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