在主方法里 我分别用new Fun();和Fun.fun()处理时,系统对于Fun对象中的成员变量处理方法截然不同,我想不通这两种情况对Fun类中的成员变量分别怎么处理的?? 望大神讲详细点! 谢谢了~!~
new Fun()这是实例化对象,实例化对象需要调用其构造函数。但由于你使用了Fun对象,其静态字段j也需要实例化,所以这里会出现两个j
Fun.fun()这里是静态方法调用,而由于你前面已经使用过Fun对象,其静态字段已经实例化完毕,因此这里只输出fun1()
我把这两个分别调试了一下new Fun();出来的结果是 java j java j 分别输出了4项,而调用静态方法出来的是 java j fun1() 这三项,这给我的感觉就是 new出来的不但new时要调用一次构造,在处理字段时再调用一次构造。 如果我把new Fun();和Fun.fun();一起执行,则出现java j java j fun()这5项,这又说明了生成静态对象只在new时调用了,Fun.fun()时不再处理字段。这样就是说构造静态的对象的话,只要一个构造已经被调用成功(这时就已分配了内存),它的构造方法只被调用一次(之后遇到相同的字段时,不再做处理),那么像我这样写的类似于递归的创建对象,每次创建在还没调用构造方法时就又去创建对象了,这样的话为什么不会出现栈溢出的问题呢?
@梦再笑: 静态字段只会实例化一次。而且不是在调用构造函数时实例化,它在你使用这个对象的时候就实例化了。
@Daniel Cai: 奥奥,那这样的话问题就全解决了。。~! 谢谢大神啊~! 。
生命周期不同,你去了解普通的构造函数与静态构造函数的以及实例成员与静态成员的区别就知道了,自己去研究得到的才是自己的!
我把这两个分别调试了一下new Fun();出来的结果是 java j java j 分别输出了4项,而调用静态方法出来的是 java j fun1() 这三项,这给我的感觉就是 new出来的不但new时要调用一次构造,在处理字段时再调用一次构造。 如果我把new Fun();和Fun.fun();一起执行,则出现java j java j fun()这5项,这又说明了生成静态对象只在new时调用了,Fun.fun()时不再处理字段。这样就是说构造静态的对象的话,只要一个构造已经被调用成功(这时就已分配了内存),它的构造方法只被调用一次(之后遇到相同的字段时,不再做处理),那么像我这样写的类似于递归的创建对象,每次创建在还没调用构造方法时就又去创建对象了,这样的话为什么不会出现栈溢出的问题呢?
前者通过调用无参构造方法创建对象也就是new fun(),后者是静态构造函数的调用。二者的生命周期不同的。
后者是普通静态方法,不是构造方法,上面打错了不好意思。就是一个普通静态方法的调用!
@isole: 我把这两个分别调试了一下new Fun();出来的结果是 java j java j 分别输出了4项,而调用静态方法出来的是 java j fun1() 这三项,这给我的感觉就是 new出来的不但new时要调用一次构造,在处理字段时再调用一次构造。 如果我把new Fun();和Fun.fun();一起执行,则出现java j java j fun()这5项,这又说明了生成静态对象只在new时调用了,Fun.fun()时不再处理字段。这样就是说构造静态的对象的话,只要一个构造已经被调用成功(这时就已分配了内存),它的构造方法只被调用一次(之后遇到相同的字段时,不再做处理),那么像我这样写的类似于递归的创建对象,每次创建在还没调用构造方法时就又去创建对象了,这样的话为什么不会出现栈溢出的问题呢?