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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© m529031854 中级黑马   /  2014-5-30 11:52  /  2128 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

谢谢!!!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
构造函数的第一句话默认是super();也就是默认调用父类的无参数构造器,你这个这样调用到底想实现什么??
回复 使用道具 举报
类变量是类加载时就存在栈中的所以构造方法可以调用,而成员变量是new后才存在堆中的。你都没存在怎么可能让你使用
回复 使用道具 举报
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);

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在创建对象的时候,会调用构造方法,而方法是在对象调用的时候才会在内存中,调用完成后,方法就会释放,而创建的对象的成员变量存放在堆中,两者的生命周期不同,所以声明是static,就会使得成员变量的声明周期加长,从而使得方法能正常的使用。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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没有初始化就会报错。自己的一点见解,供楼主参考。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

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