- 本篇主要记录java零散又容易错,但是又常常被忽略的问题。
①.因为笔者对jvm虚拟机不是很了解,所以没办法做出深层次的讲解
②.所有结论都是查网络,查资料和亲自跳坑得出来的,如果不对的和片面的请看到的不吝赐教
1.java变量声明后直接输出会不会报错?
1.1.举例
public class JavaTest {
//1.类静态变量只声明
static int a;
static char c;
static long l;
static String s;
static boolean aBoolean;
//2.类成员变量只声明
int anInt;
char cChar;
long ll;
String ss;
boolean aBoolean2;
public void test(){
//3.方法中的局部变量只声明
int aint;
System.out.println(aint);
System.out.println("----类变量-----");
System.out.println("static int:"+a);
System.out.println("static char:"+c);
System.out.println("static long:"+l);
System.out.println("static String:"+s);
System.out.println("static boolean:"+aBoolean);
System.out.println("----类成员变量-----");
System.out.println("int:"+anInt);
System.out.println("char:"+cChar);
System.out.println("long:"+ll);
System.out.println("String:"+ss);
System.out.println("boolean:"+aBoolean2);
}
public static void main(String[] args) {
JavaTest t = new JavaTest();
t.test();
}
}
1.2.输出
- 其中 ①.类静态变量只声明;②.类成员变量只声明;并不为其赋值,直接使用
----类变量-----
static int:0
static char:
static long:0
static String:null
static boolean:false
----类成员变量-----
int:0
char:
long:0
String:null
boolean:false
- 其中 ③.方法中的局部变量只声明;不为其赋值,直接使用
编译报错:Error:(90, 28) java: 可能尚未初始化变量aint
1.3.结论
- 类的成员变量只声明,不赋值直接使用,会输出默认值
对于类的成员变量(静态变量),不管程序有没有显示的初始化,Java虚拟机都会先自动给它初始化为默认值。
- 局部变量只声明直接输出会报错
①.局部变量声明后,Java虚拟机不会自动给它初始化为默认值。因此对于局部变量 必须经过显示的初始化,才能使用它。
②.如果使用一个没有被初始化的局部变量,编译器会报错。局部变量存储于虚拟机栈的局部变量表中
③.局部变量只声明,不初始化,并不会报错,只有在其被使用时,又未初始化,才会报错。(也就说,我只声明一个变量放在那看,没关系的,不过应该没人会这么干)
2.为什么不能在java类中方法外给已定义的成员变量赋值?
2.1.举例
public class JavaTest {
/**
* 对成员变量进行声明(定义)
*/
int test1;
int test2;
//1.直接为其赋值
test1 = 1;
//2.使用代码块为其赋值
{
test2 = 2;
}
public void test(){
System.out.println("test1"+test1);
System.out.println("test2"+test2);
}
public static void main(String[] args) {
//3.在mian()方法中为已定义变量赋值
int test3;
test3 = 3;
System.out.println("test2"+test2);
JavaTest t = new JavaTest();
t.test();
}
}
2.2.输出
编译报错:Error:(64, 8) java: 需要<标识符>
test2:2
2.3.结论:
- 不能直接为已声明的成员变量赋值(初始化)(网上比较好的解释)
①.成员变量在类的范围内,存在于堆内存中,会有默认的初始值,在声明的同时已经给变量赋值了。再次”赋值“实际是使用了语句,而类体里面只能出现变量和方法,不能出现语句。
②.上面过程是2个操作,第一个,声明一个类的成员变量,第二个,对成员变量赋值,而成员变量属于对象,对它的赋值只能由对象来操作,在类中单独对其赋值,当然要报错了。成员变量可以不用赋初值,在new对象的时候,系统会默认分配一个初值,基本数据类型赋为0,引用类型的成员变量赋值为null
- 为什么可以在代码块中执行赋值语句
①.代码块的执行是在对象的初始化操作的时候执行,代码块中可以包含任何可执行操作,在代码块中对声明的变量进行初始化,即相当于在类中执行 int test2 = 2; 这个操作。
②.在main()方法中,既然是在方法中,那么就是局部变量,也就是一个方法的属性,局部变量声明后,必须赋值才能使用,要不然只能看着。