public class TestSwitch{
public static void main(String args[]){
TestSwitch tni = new TestSwitch();
String s = tni.convert(4);
System.out.println(s);
}
public String convert(int n){
String day;//这里为什么可以不用初始化?难道day是成员变量吗
switch(n){
case 1:
day = "星期一";
break;
case 2:
day = "星期二";
break;
case 3:
day = "星期三";
break;
case 4:
day = "星期四";
break;
case 5:
day = "星期五";
break;
case 6:
day = "星期六";
break;
case 0:
day = "星期日";
break;
default:
day = "非法";
break;
}
return day;
}
}
public static void main(String args[]){
TestSwitch tni = new TestSwitch();
String s = tni.convert(4);
System.out.println(s);
}
public String convert(int n){
String day;//这里为什么可以不用初始化?难道day是成员变量吗
switch(n){
case 1:
day = "星期一";
break;
case 2:
day = "星期二";
break;
case 3:
day = "星期三";
break;
case 4:
day = "星期四";
break;
case 5:
day = "星期五";
break;
case 6:
day = "星期六";
break;
case 0:
day = "星期日";
break;
default:
day = "非法";
break;
}
return day;
}
}
成员变量有默认值,(被final修饰且没有static的必须显式赋值),局部变量不会自动赋值....但是为什么我感觉这个day是局部变量啊,为什么也不用初始化的?我的天啊
可以初始化啊,你把它改为 String day="asdfgadgjjfsadk";一样。
为什么它不初始化?因为下面要根据输入的那个数字来赋值,这里先初始化是多此一举,并且下面所有情况都处理了,所以这里不用初始化。不初始化还有个好处,就是它省了内存空间。
String day="asdfgadgjjfsadk";如果它在内存中没找到asdfgadgjjfsadk的内存地址,会在内存中分配个内存段给它存储asdfgadgjjfsadk,而下面又赋值了,同样去找那些汉字,没有的话,又要分配内存。而已分配给asdfgadgjjfsadk的内存要等到JVM垃圾回收才释放掉所以说在一段时间内省了内存。个人理解,请大虾指教
package algorithm;public class TestSwitch {
public static void main(String args[]) {
String s = "s";
TestSwitch tni = new TestSwitch();
tni.convert(s);
} public String convert(String s) {
String day;
s = day;
System.out.println(s);
return s;
}
}
public class Test{
public static void main(String args[]){
int result;//
for(int i=1;i<=100;i++){
result+=i;
}System.out.println(result);
}
}如果这样编的话程序会报错,说result是局部变量要初始化后才行,而上面那个day同理也应是局部变量为何就那样呢纠结啊啊啊啊神啊
public static void main(String args[]){
int result;
for(int i=1;i<=100;i++){
result=2;
}System.out.println(result);
}
}那分析下为什么这个编译也错呢,result=2不是算初始化了吗???那为什么编译时报错说system.out.println(result说这个是局部要初始化才得)
switch中存在default情况,编译器能分析出你使用day之前肯定初始化了。而循环的情况下,编译器不会分析循环是不是真正执行,并不能保证在输出result之前已经初始化了。
比如你写个
for(int i=1;i <=100;i++){
还是
for(int i=1;i <=0;i++){
对编译器的分析行为是没有影响的
因为你的"初始化"在for内部做得
因为switch跟for不同啊,switch的default会被编译器分析。for的第一个分号前面的会被for后面的分析。for内部的不算。
你可以用
String day;// 这里为什么可以不用初始化?难道day是成员变量吗
for (day = ""; day != "";) {
day = "a";
}
System.out.println(day);
去试,保证又TMD不报错叻。。乃乃的java真是害死人,楼主你说呢?
同意,我当初一点java基础都没有,啃一本Java 2 Enterprise Edition啃叻两个星期还是啥不明白。但是就开始作项目叻。后来的慢慢也就知道叻。
一开始就追根问底确实会累的要死