Print类也是静态的,不需要实例化,当然也可以调它内部的静态方法了。

解决方案 »

  1.   

    print是静态属性,在jvm装载时就已经被实例化(初始化),虽然其值为空。
    所以在该类的任何方法里都可以用它而不用实例化(初始化)。
      

  2.   

    你的做法叫做“Static member accessed via instance of reference.”。
    虽然不会出错,但是这样做并不被推荐。增加了阅读的难度,把与实例无关的东西和实例放在了一起。有些开发环境,比如IDEA就会自动警告这类的问题。
    其实很多人都有类似的写法,都不好,比如:
    <<Thread.currentThread().sleep(1000);>>
    为什么不换成 Thread.sleep(1000) 就可以了呢?
    还有:
    <<this.assertEquals(a,b);//junit>>
    为什么不写成 assertEquals(a,b) 或者 TestCase.assertEquals(a,b) 更清楚一些。
      

  3.   

    觉得
     xiaohaiz(老土进城,两眼通红) 
    的说法很有道理
      

  4.   

    其实你完全可以把 static Print print=null;注释掉
                  把 print.output();改成Print.output();
    这样更清晰易读!!!
      

  5.   

    这里给出一些对static的理解:
       1。static可以应用于成员变量,也可以应用于成员方法。
          此时分别称为类变量和类方法,与之相对的称为实例变量和实例方法。     类变量和类方法不需要该类初始化就可以直接由className.classVar or className.calssMethod 来调用。     类方法不能调用成员变量,但能调用类变量。 但实例方法可以调用实例变量和类变量。   2。static 对象(类变量和类方法)在该类第一次调用时初始化,而实例对象(实例变量和实例方法)在new时才初始化。
      

  6.   

    我一直认为java的语法是不允许上面的这种情况的,至少在运行时应该产生空指针异常
    可是实际情况是整个运行的都很顺利,理论上讲,上面的代码可以这样来理解
    print == null
    print.output == null.output
    在java的语法规则里null是没有任何类型的,那么等于null的变量就是空类型
    而世纪的情况证明是这个变量成了Print类型的空指针,这个c/c++的指针类型完全一样
    不知道c++遇到这种情况会怎么样
      

  7.   

    这样理解?这样的代换是不成立的。
    虽然print = null,但是print是有类型的。
      

  8.   

    public void getPrint(){
        
         Print a;
         a.output();
        
        }
    刚刚加了这么一段代码,编译的时候出错了
    对于第一段代码,把static Print print = null;改为Print print;后结果一样
    那么java在类的成员初始化的时候肯定做过什么
      

  9.   

    public void getPrint(){
        
         Print a=null;
         a.output();
        
        }
    当改成上面的代码的时候运行结果又是正常的
      

  10.   

    类成员被自动初始化为null
    而静态函数是可以通过没有初始化的有类型的null变量来调用的
    还好java的编译器并不允许null varname;的声明
      

  11.   

    初始化时:1.静态函数初始化
             2.构造函数的调用
             3.变量初始化(并不是您初始化为你所设的值,而是java默认值)
      

  12.   

    运行楼主这段代码,偶得不到结果也
    public void getPrint(){
        
         Print a=null;
         a.output();
     
        }报java.lang.NullPointerException空指针的错误
      

  13.   

    我也被static搞得个半死,关注顶!
      

  14.   

    当Print类的output方法为静态的时候,属于类方法
    不管Print的实例有没有初始化(不知道没有初始化的算不算实例:)
    都可以调用它的类方法,虽然它为null,但是它具有类型Print
    那么可能在编译器实现的时候,它首先指向一个空的结构(Pring类型的null值)
    而很明显这个结构本身拥有指向类的公用空间的指针,这个公用空间里有
    所有实例都可以共同调用的方发表,而在运行时java虚拟机显然并没有检查
    变量是否是个空“指针”,而是直接查找了变量的方法表,不然也不会在程序时
    产生NullPointerException了。更改过的代码main函数中需要实例化InnerClass类
    jdk1.4.1_01版编译运行毫无问题
      

  15.   

    这个问题,很简单,如果你知道JAVA的代码是如何执行,这个问题就清楚了.首先我解释一下为什么要实例化非静态类才能运行,因为非静态类在程序LOAD的过程中,并
    没有存在与内存中,而实例化使这个类有了相关属性,并存在与内存中.而静态类,在程序开始LOAD时候就已经进入内存,所以他的方法不用实例化直接可以调用了
      

  16.   

    我就产生了NullPointerException,关注!
      

  17.   

    加条广告(注:如果你不高兴,可以删除)
    招聘网页编程人员(1-2名)
    1-2年的网页编程经验
    语言:JSP,java,html,javascript
    请在简历中写明对以上语言的掌握程度以及学历.北京友联创新系统集成有限公司
    联系方式:
    010-62984859-8010王先生
    [email protected]
      

  18.   

    静态类是不需要实例化了
    楼主说:对于第一段代码,把static Print print = null;改为Print print;后结果一样可我改成那样运行正常的啊.JDK1.4.1