一道笔试题
22. 下面代码的运行结果为:()
import java.io.*;
import java.util.*; public class foo{ public static void main (String[] args){ String s; System.out.println("s=" + s); } }
A 代码得到编译,并输出“s=”
B 代码得到编译,并输出“s=null”
C 由于String s没有初始化,代码不能编译通过
D 代码得到编译,但捕获到 NullPointException异常
答案:C
解析:开始以为会输出null什么的,运行后才发现Java中所有定义的基本类型或对象都必须初始化才能输出值。
以上解析错了.
原因是,方法中的局部变量一定要手动初始化,不然编译会报错.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable s may not have been initialized
二. 那么也就是说,全局变量不需要手动初始化,JVM会自动初始化为null或0.
public class Test00001{
static String s;
String x=8;
String y;
/*string类型在代码中属于局部变量,那么局部变量必须赋值,哪怕是null,否则编译通不过的,
* 会提示说此变量未初始化,如果是类的成员变量,则可以不赋值,它会有默认值的。
java为了规避一些运行期间的空指针错误,都会强调局部变量必须赋值,
否则编译器会立即报错,提示用户修改。 */
public static void main (String[] args){ Test00001 t = new Test00001();
System.out.println(t.s);//输出null
System.out.println(t.x);//输出null
System.out.println(x);//报错,没有初始化,或者不是类静态变量
//方法中不能调用类的非静态变量属性??哪怕已经初始化.
System.out.println("s=" + s);//输出null } }
只要能够调用,全局变量(也就是类变量)都有自动的初始化值. 不会产生编译器报错
三.但是又产生一个新问题,很重要,
类的静态方法(函数)中为什么不能调用非静态成员(属性)?
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:class CA{private:int a; //非静态成员,创建类的实例时分配内存,类的不同实例对应不同的内存区域
yes,上诉就是真正的原因.
所以main方法也是static 类的静态方法,所以他不能直接调用类的非静态属性和方法. 此时,虽然不需要初始化类属性变量,但是因为不能直接调用非静态变量,依然报错.
public class Test04 {
String s;
public static void main(String[] args) {
System.out.println(s);//报错
} }
Unresolved compilation problem:
Cannot make a static reference to the non-static field s
注意这和一开始的局部变量一定要初始化报错,本质不同!
四.那么类中非静态方法可以直接调用非静态变量吗?,可以!
public class Test02 {
String s;
public static void main(String[] args) {
Test02 t = new Test02();
t.test(); //输出null
}
public void test(){
System.out.println(s);
}
}
原因是在 new 实例化一个类的 对象时,会加载这个类的所有属性和方法,将其放到内存中来.
但是,以下又会报错:
public class Test02 {
String s;
public static void main(String[] args) {
Test02 t = new Test02();
t.test();
System.out.println(s);//报错
}
public void test(){
System.out.println(s);
}
}
Unresolved compilation problem:
Cannot make a static reference to the non-static field s
还是会报 静态方法不能调用非静态变量.
虽然,在静态方法中初始化这个类的对象.
原因暂时不清楚,java ,new一个对象和类静态域,是不是在内存中不是一个地方, 以前看过一个视频,好像是放在