当前位置: 技术问答>java相关
谁能讲的明白就送分,共同探讨一下关于static。
来源: 互联网 发布时间:2015-04-26
本文导语: public class Q1 { static void processorB() { System.out.println(" is a boolean Operator."); } static Q1 processorA(){ Q1 q=null; if (("java").startsWith("null")) return q; ...
public class Q1 {
static void processorB() {
System.out.println(" is a boolean Operator.");
}
static Q1 processorA(){
Q1 q=null;
if (("java").startsWith("null"))
return q;
else
return null;
}
static {
System.out.print("Java".startsWith(""));
}
public static void main(String[] args) {
processorA().processorB(); //静态调用。顺利通过!
}
输出为“true is a boolean Operator.”。我觉得processorA()返回一个null给main后再调用processorB()时应该抛出一个NullPointerException,可是实际却正常输出了,这是怎么回事?
static void processorB() {
System.out.println(" is a boolean Operator.");
}
static Q1 processorA(){
Q1 q=null;
if (("java").startsWith("null"))
return q;
else
return null;
}
static {
System.out.print("Java".startsWith(""));
}
public static void main(String[] args) {
processorA().processorB(); //静态调用。顺利通过!
}
输出为“true is a boolean Operator.”。我觉得processorA()返回一个null给main后再调用processorB()时应该抛出一个NullPointerException,可是实际却正常输出了,这是怎么回事?
|
processorA().processorB();
编译时:编译器发现processorA()的返回类型是Q1
Q1的processorB()是static,不需要把processorA()返回的对象传递给processorB(),所以不会抛出NullPointerException
((Q1)null).processorB();一样可以正常运行
|
都说了这么多了,来晚了:(
一切都是因为static被它修饰的对象是存放在内存中的静态存储区当中,而不是堆载中.它在你还没有执行main以前就已经被初始化了,并一直存放在静态存储区之中,它只有一个拷贝,不属于你的某一个实例,而属于该类的所有实例共享之.static方法的最大特征就是不必实例化它所在的类就可以直接调用它,为什么??因为编译器早就已经在静态存储区里面加载了它.常用的NEW是动态实例创建,在堆里面加载对象实例在载里面分配指针,它的指针必须指向一个对象才有意义(所以不允许为NULL).而现在static方法他奶奶的早就在静态存储区中创建好了,直接区调就是了,还在乎什么指针???
Q1.processorB();
奶奶的,今天怎么老碰到问static的??!!到C++那边看看去...要加分啊!!!
一切都是因为static被它修饰的对象是存放在内存中的静态存储区当中,而不是堆载中.它在你还没有执行main以前就已经被初始化了,并一直存放在静态存储区之中,它只有一个拷贝,不属于你的某一个实例,而属于该类的所有实例共享之.static方法的最大特征就是不必实例化它所在的类就可以直接调用它,为什么??因为编译器早就已经在静态存储区里面加载了它.常用的NEW是动态实例创建,在堆里面加载对象实例在载里面分配指针,它的指针必须指向一个对象才有意义(所以不允许为NULL).而现在static方法他奶奶的早就在静态存储区中创建好了,直接区调就是了,还在乎什么指针???
Q1.processorB();
奶奶的,今天怎么老碰到问static的??!!到C++那边看看去...要加分啊!!!
|
因为static是属于类的而不是属于蒙一个对象,所以,系统在调用static
函数时不回去验证对象是不是为NULL,因为他现在类的时候初始化了(即已经分配了地址空间了),而不是在对象调用的时候,才初始化
所以,系统是能找到其地址的,并能调用属于类调用而不是对象调用
明白了吗?
给分给分,^-^
函数时不回去验证对象是不是为NULL,因为他现在类的时候初始化了(即已经分配了地址空间了),而不是在对象调用的时候,才初始化
所以,系统是能找到其地址的,并能调用属于类调用而不是对象调用
明白了吗?
给分给分,^-^
|
http://www.csdn.net/expert/topic/587/587079.xml?temp=.7879602
|
这只是一种规范,没什么其他的,你可以这样理解。
对于static的成员,我们都知道是他是属于类的,因此与这个类的对象没有关系,所以无论这个类是否是null,都可以调用类的static 函数
对于static的成员,我们都知道是他是属于类的,因此与这个类的对象没有关系,所以无论这个类是否是null,都可以调用类的static 函数
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。