一个简单的语法问题想跟大家讨论

iceshape1 2003-11-24 02:40:21
public class InnerClass {
static Print print=null;
public static void main(String[] args) {
// print = new Print();
callPrint();
}

public static void callPrint(){
System.out.println(Print.OUTPUT);
print.output();
}

public static class Print{
public static String OUTPUT = "out put contents:";
static void output(){
System.out.println("I am doing a inner classes of examination.");
}
}
}
这是同时学习面向对象过程中的一个测试代码,但其中出现了这样的疑问:
print明显是一个没有实例化的空值变量,却可以在方法callPrint中调用
Print内部类的静态方法,让人觉得很疑惑
...全文
88 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
cql0007 2003-11-27
  • 打赏
  • 举报
回复
静态类是不需要实例化了
楼主说:对于第一段代码,把static Print print = null;改为Print print;后结果一样

可我改成那样运行正常的啊.JDK1.4.1
wyb_45 2003-11-25
  • 打赏
  • 举报
回复
加条广告(注:如果你不高兴,可以删除)
招聘网页编程人员(1-2名)
1-2年的网页编程经验
语言:JSP,java,html,javascript
请在简历中写明对以上语言的掌握程度以及学历.

北京友联创新系统集成有限公司
联系方式:
010-62984859-8010王先生
ylcxkj@vip.sina.com
paulone 2003-11-25
  • 打赏
  • 举报
回复
我就产生了NullPointerException,关注!
满天飞舞rose 2003-11-25
  • 打赏
  • 举报
回复
这个问题,很简单,如果你知道JAVA的代码是如何执行,这个问题就清楚了.

首先我解释一下为什么要实例化非静态类才能运行,因为非静态类在程序LOAD的过程中,并
没有存在与内存中,而实例化使这个类有了相关属性,并存在与内存中.

而静态类,在程序开始LOAD时候就已经进入内存,所以他的方法不用实例化直接可以调用了
iceshape1 2003-11-25
  • 打赏
  • 举报
回复
当Print类的output方法为静态的时候,属于类方法
不管Print的实例有没有初始化(不知道没有初始化的算不算实例:)
都可以调用它的类方法,虽然它为null,但是它具有类型Print
那么可能在编译器实现的时候,它首先指向一个空的结构(Pring类型的null值)
而很明显这个结构本身拥有指向类的公用空间的指针,这个公用空间里有
所有实例都可以共同调用的方发表,而在运行时java虚拟机显然并没有检查
变量是否是个空“指针”,而是直接查找了变量的方法表,不然也不会在程序时
产生NullPointerException了。更改过的代码main函数中需要实例化InnerClass类
jdk1.4.1_01版编译运行毫无问题
exitzhang 2003-11-25
  • 打赏
  • 举报
回复
静态!
cql0007 2003-11-25
  • 打赏
  • 举报
回复
我也被static搞得个半死,关注

顶!
dancekite 2003-11-25
  • 打赏
  • 举报
回复
运行楼主这段代码,偶得不到结果也
public void getPrint(){

Print a=null;
a.output();

}

报java.lang.NullPointerException空指针的错误



Jawan_lee 2003-11-24
  • 打赏
  • 举报
回复
初始化时:1.静态函数初始化
2.构造函数的调用
3.变量初始化(并不是您初始化为你所设的值,而是java默认值)
iceshape1 2003-11-24
  • 打赏
  • 举报
回复
类成员被自动初始化为null
而静态函数是可以通过没有初始化的有类型的null变量来调用的
还好java的编译器并不允许null varname;的声明
iceshape1 2003-11-24
  • 打赏
  • 举报
回复
public void getPrint(){

Print a=null;
a.output();

}
当改成上面的代码的时候运行结果又是正常的
iceshape1 2003-11-24
  • 打赏
  • 举报
回复
public void getPrint(){

Print a;
a.output();

}
刚刚加了这么一段代码,编译的时候出错了
对于第一段代码,把static Print print = null;改为Print print;后结果一样
那么java在类的成员初始化的时候肯定做过什么
xiaohaiz 2003-11-24
  • 打赏
  • 举报
回复
这样理解?这样的代换是不成立的。
虽然print = null,但是print是有类型的。
iceshape1 2003-11-24
  • 打赏
  • 举报
回复
我一直认为java的语法是不允许上面的这种情况的,至少在运行时应该产生空指针异常
可是实际情况是整个运行的都很顺利,理论上讲,上面的代码可以这样来理解
print == null
print.output == null.output
在java的语法规则里null是没有任何类型的,那么等于null的变量就是空类型
而世纪的情况证明是这个变量成了Print类型的空指针,这个c/c++的指针类型完全一样
不知道c++遇到这种情况会怎么样
Shrewdcat 2003-11-24
  • 打赏
  • 举报
回复
这里给出一些对static的理解:
1。static可以应用于成员变量,也可以应用于成员方法。
此时分别称为类变量和类方法,与之相对的称为实例变量和实例方法。

类变量和类方法不需要该类初始化就可以直接由className.classVar or className.calssMethod 来调用。

类方法不能调用成员变量,但能调用类变量。 但实例方法可以调用实例变量和类变量。

2。static 对象(类变量和类方法)在该类第一次调用时初始化,而实例对象(实例变量和实例方法)在new时才初始化。
caiyi0903 2003-11-24
  • 打赏
  • 举报
回复
大小写是区分的,一个静态成员变量,一个静态方法。
zhangxf 2003-11-24
  • 打赏
  • 举报
回复
其实你完全可以把 static Print print=null;注释掉
把 print.output();改成Print.output();
这样更清晰易读!!!
Leemaasn 2003-11-24
  • 打赏
  • 举报
回复
觉得
xiaohaiz(老土进城,两眼通红)
的说法很有道理
北极猩猩 2003-11-24
  • 打赏
  • 举报
回复
不过调用静态函数最好的办法是使用类名,免得出现误会。
北极猩猩 2003-11-24
  • 打赏
  • 举报
回复
调用静态方法不需要引用指向任何对象。
加载更多回复(5)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧