public class TestConstructor {

public static void main(String args[]){ Constructor c = new Contructor(1);
System.out.println(c.j+"/"+c.i);
}
}
class Constructor{

int i;
int j; public Constructor(int i){ }
}
//输出结果:0/0
-------------------------------------------------------------------
问题:《JAVA核心技术》里面说“仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器”,所以我提供了一个带参数的构造器,系统应该不给我提供默认的了。但是我并没有在自己写的构造器里面给域赋值,那么输出结果中的“0/0”是哪来的?

解决方案 »

  1.   

    (1)Constructor c = new Contructor(1); 楼主确保这是对的哈。
    (2)使用默认值哈。
      

  2.   

    那你需要看看关于对象初始化的过程了。当你创建一个对象的时候class Constructor{int i;
    int j;public Constructor(int i){}
    }首先他会先初始化各个字段然后再调用构造方法。相当于每个字段都初始化了2遍因为你写的是
    int i;
    int j;
    他就帮你默认初始化成0了。
      

  3.   

    这个跟构造器是没关系的,类变量(属性)是不用有初始化值的是因为虚拟机会帮你默认赋值,int型的是0,而局部变量是必须赋值的,虚拟机不会帮你默认赋值。类在创建的时候是先创建属性,再创建方法的。 
      

  4.   

    恩,是我没搞明白,成员变量已经被初始化了,那么构造器的作用又是什么呢?仅仅为new Constructor()的时候在类中提供一个Constructor()吗?而这个类中默认的Constructor()有什么意义呢?
      

  5.   

    java 里int 类型默认值是0。这句Constructor c = new Contructor(1);是调用了public Constructor(int i){}
    这个构造方法,但你的构造方法里没有对i和j做任何初始化。因此System.out.println(c.j+"/"+c.i);就输出0/0 
      

  6.   

    //传的参数没有被处理,
    //按默认情况  i,j,默认情况是 0,0//貌似,楼主的 Constructor c = new Constructor(1); //这个单词写错了//如果:
    public Constructor(int i){
        this.i = i ; //这样的话结果就不同了, }
      

  7.   

    所有int变量 若不初始化, 则默认初始化0.这个是Java为了安全定的。
      

  8.   

    7L,8L回答的最准确了。
    我也在学,借LZ贴一用。这里的
    Constructor c = new Constructor(1);

    new Contructor(1);
    有何区别?为何构造器要这样写呢?
      

  9.   

    回12L
    new Constructor(1);实例化了一个新的对象,这个对象没有被引用,但却存在。(没有以用会被自动回收)
    Constructor c = new Constructor(1);
    用c来引用了这个新的实例化对象。他俩的区别就是一个你可以使用,另外一个你用不了
      

  10.   

    哦  那就是说new Constructor(1)这个是构造器专属的意思吧
      

  11.   

    今天改了一下,为j声明时赋了个2,其他部分不变。输出结果是:2/0
    可见在调用构造方法之前,成员变量就已经被初始化,而且是按照用户给的值进行初始化的,如果没给就按默认(0、null那些……)LS有几个兄弟说的挺好,大家可以参考3L还有http://topic.csdn.net/u/20111125/17/d7ea8861-9655-4de9-93da-05a134c61d78.html
      

  12.   

    直接new Constructor(1).j就可以,比如System.out.println(new Constructor(1).j);
      

  13.   

    public class TestConstructor {public static void main(String args[]){Constructor c = new Constructor(1);
    System.out.println(c.j+"/"+c.i);
    }
    }
    class Constructor{int i;
    int j;public Constructor(int i){
    System.out.println(i=2);}
    }构造器是不会返回任何值的,所以无论你的i怎么变都将是Constructor类的定义值。
    再试试,8L提供的方法。
      

  14.   

    我知道,其实,你写的那个是被处理的。在里面写个打印i,结果是i=1.
    但在主程序里面打印的是i=0.
    我的理解是,构造器初始化了i=1,但没有返回到主程序里面去。令人不解。
    话说这是构造器初始化的么?为何有的能初始化,有的却不能呢?
    如,
    class Constructor{int i;
    int j;public Constructor(){i=1;//这样就可以初始化i=1了。
                           int i=1;//为何这样就不能了呢?}
    }
      

  15.   

    int  类型默认 传值就是0 。。哪怕你不赋值
      

  16.   

    当你通过构造器创建Constructor实例的时候,成员变量i j 被赋予了默认值
      

  17.   

    仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器
    这句话是绝对true的
      

  18.   

    所有的类型在Java虚拟机运行时,都有一个默认值,int类型Java虚拟机会默认初始化为0,如果你没有手动为int类型变量赋值,大多数比较直观的情况下,Java的编译器会发现这个“为初始化错误”。这使你在编写代码的时候就会被提示变量未初始化。但是也有的时候(估计你现在就碰上了)虚拟机没有发现变量为初始化。虚拟机为了避免程序因为使用了未初始化的变量而导致运行错误,所以为你的变量赋值为默认值。
      

  19.   

    类在加载的时候,其变量会赋予默认值的。int的默认值就是0,boolean的默认值为false而构造函数的作用就是生成对象,对其对象进行初始化。默认值和初始化是不一样的
      

  20.   

    你调用的是带参方法,你带参方法你面什么都没写,int默认值为0,所以你输出的是0啊