public class Test4{
static Test4 t=new Test4();//为什么加上static就能正确运行 如果把static去掉运行会报错  这是为什么啊?
 public Test4(){
 
 }
public static void main(String []args){
Test4 t1=new Test4();
}
}我加了注释的那一句谁能给我解释解释啊?

解决方案 »

  1.   

    去掉static也是可以运行的啊,你这个又不是单例模式
      

  2.   

    可以肯定的是不加static会栈溢出 是个无出口的递归调用至于加了为什么可以:
    1.静态对象指的是不依赖对象的创建而创建的对象或方法或属性
    2.被定义为static 的方法或属性或内部类对象,会在所在类被加载时就被创建
      

  3.   

    static 可以修饰属性、方法、类
      

  4.   

    刚才解释的不清楚么?去掉static后, Test4 t 就是类Test4的实例成员,也就是说:会在类Test4在实例化(new)时被初始化。而你这个“Test4 t”又恰好是new一个自己,那么又会立即触发新的实例化动作;
    这个实例化动作又需要初始化成员变量 t;
    然后又触发新的实例化动作;
    接着这个实例化动作又需要初始化成员变量 t;
    ......
    显然就是个死循环
      

  5.   

    楼上说的对,我补充一点,static 修饰的变量,初始化块在只会在加载类的时候执行一次只有一次。
      

  6.   

    如果是静态的,则它的成员就不再new这个静态成员了
      

  7.   

    1、被static修饰的方法和属性是属于类本身的(所以可以用类名直接调用)、而没有被static修饰的方法和属性是属于对象的、得依托于对象存在(必须用对象调用)
    2、静态的属性和方法只在程序启动的时候加载一次、加载后只产生一份、可以被共享。非静态属性是生成一个对象就在内存中给这个对象拷贝一份这些属性、这些属性对于每个对象都是独立的。你这个程序不加static的时候你一运行这个程序首先MAIN方法中要产生一个Test4的对象、由于类里面也有一个生成的Test4对象属性、同时他继续产生这样一个对象、这个对象属性又会被拷贝一份并再次产生一个这样的对象、一直循环下去、形成死循环、一直到产生很多这样的对象的时候导致内存溢出。
    如果加上static、首先这个属性只属于类、不依赖于对象存在、你不管产生多少这样的对象、这个属性都只有一份、所以不会有上面的问题出现。
      

  8.   

    如果加上static、首先这个属性只属于类、不依赖于对象存在、你不管产生多少这样的对象、这个属性都只有一份、所以不会有上面的问题出现。我对上面的这句话 还不是很理解啊!我想知道为什么加上static就产生一个对象???
      

  9.   

    首先无论他加不加static他都是定义在这个类里面的一个属性
    当你生成一个这个类的对象的时候这个属性将在内存中产生一份拷贝、供这个对象调用、关键你的这个属性还是这个类本身的属性、他有生成一个这个对象、这样一直循环下去就产生了过多的对象、而垃圾回收机制无法即时回收、所以当内存中对象过多、就会内存溢出。
    只要被定义为static的属性、在你生成第一个对象的时候就执行了一次、以后再也不执行了、所以不会形成循环(static修饰的东西在程序一执行就加载、而且只加载一次)。
    简单的说、static是属于类的、类只有一个、所以只有一个、而非static属性属于对象、所以产生一个对象这些属性就要被拷贝一份、当这个属性为对象本身的话、他就会一直生成。
      

  10.   

    static 是类静态成员,本质上它就是唯一的。静态成员完全独立于该类的任何实例,只要类定义被加载,静态成员就会自动完成初始化,且仅此一次。某种意义上来说,有点类似于其它语言的“全局变量”的概念;但Java这里仍有隶属关系,不是绝对意义的“全局”。
    你难道没发现,访问类静态成员直接可以写: 类名.成员名
    根本就不需要先:new 类名() 来创建实例么?