A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1312564637   /  2015-10-14 12:15  /  11366 人查看  /  57 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

定义局部变量时赋值这是一个好的编程习惯。假如定义局部变量时没有赋初值,那么在程序运行时编译器会给该局部变量重新分配空间,这样效率低下,并且浪费栈空间。
回复 使用道具 举报
  1. class  Demo6
  2. {
  3.         int x;//此处x属于成员变量(定义在类内),具有默认值0,可以直接使用,相当于int x=0;
  4.         public static void main(String[] args)
  5.         {
  6.                 int y;//此处y属于局部变量(定义在方法内),虽然我并未给它赋值,但是如果我并没有使用它,那么编译就不会报错
  7.                 for(int z=0;1<5;z++)
  8.                 {
  9.                         y=4;
  10.                         //此句代码在编译之前,系统会先编译y=z,因为这两句在一个作用域里面,所以赋值了,编译不出错
  11.                         System.out.println(y);
  12.                         break;
  13.                 }
  14.                 /*报错,编译时是找语法错误,而之上的for语句需要被执行,才会有赋值,但是编译时是不会去执行代码的,所以虽然for循环的条件100%永久成立,但是在相同的作用域下,只有个for循环,并没有赋值语句。所以y没有被赋值,因此这句话会报错.如果在第6行时给y赋值2,那么此句不会报错,但是输出的结果是4,这是因为执行时,for循环中又重新赋值了*/
  15.                 System.out.println(y);
  16.         }//楼主,思考代码会不会报错,要站在编译器的角度思考,不要站在执行者的角度思考
  17. }
复制代码
回复 使用道具 举报
1312564637 发表于 2015-10-14 14:30
public static void main(String[] args) throws IOException {
       FileInputStream fi=new FileInputS ...

这里面可定不会出错了。因为:while((len=fi.read())!= -1){
中len=fi.read()本身就是在为len赋值。如果说不太平常是因为这里是使用fi.read()的返回值为len赋值了。
回复 使用道具 举报
你首先得区分局部变量和成员变量
回复 使用道具 举报
1312564637 发表于 2015-10-14 14:28
public static void main(String[] args) {
                //isZhi(13);
                isZhi(96);

局部变量变量是存储在栈内存,栈内存的变量都没有默认初始化值的。成员变量存储在堆内存,堆内存的变量都有默认初始化值,如String是null int 类型是0。有的局部变量能用因为是引用类型,存储在堆内存。比如数组,数组存储在堆内存,元素有默认初始化值
回复 使用道具 举报
你仔细看看,确定是局部变量吗?确定变量在方法里吗?
回复 使用道具 举报
局部变量不许定义个方法里  或者方法声名上(就是当作参数传递)  先把概念高清楚
回复 使用道具 举报
第一个叫做声明变量,  第二个叫做定义变量
回复 使用道具 举报
那当然是有的是默认了,系统在进行读取的时候会自动给他赋值,就比如int的默认值就是0,不过还是最好带上初始值,养成一个好习惯嘛,,,,,学姐把分给我吧,新人需要啊!!!
回复 使用道具 举报
请理解成员变和局部变量之间的区别

点评

类中方法外是成员变量,在类中有效,在堆中。,,方法中是局部变量,在方法中有效,在栈中  发表于 2015-10-18 07:43
回复 使用道具 举报
我觉得有的不赋初值没事,有的会报错。这首先应该说下局部变量都在在哪些地方存在,在方法后面的形参中、在方法内定义的变量。这时方法后面的形参中的变量可以不用赋初值,因为在调用的时候就会给他赋值了。但在方法内定义的变量,这时要赋初值,不然会报错。
回复 使用道具 举报
局部变量你不赋值的话,不引用它就没事,一用它就会报错。所以使用前还得赋值一次,可以先在上面定义,比如int a;  然后下面要想用a的话,就再输入 a = 10; 就行了。其它类型的都可参考这种方法
回复 使用道具 举报
tf0612 中级黑马 2015-10-20 10:42:26
33#
在定义局部变量的代码块内,定义时没有给初始值,但是后面的语句给它赋值了,也 不会报错,例如:int a;
回复 使用道具 举报
可能跟你用的编译器有关吧
回复 使用道具 举报
首先,你要理解,什么叫使用变量,是不是只要代码中出现了该变量就是使用了变量?我觉得不是。
我认为这“要先初始化才能使用”中的使用是指获取(get)变量的值。而其中的“初始化”就是设置(set)变量的值。
不管定义变量在哪里,有没有给初始化值,只要在获取(get)变量的值之前设置(set)了变量的值,就不会报错。
回复 使用道具 举报
1312564637 发表于 2015-10-14 14:28
public static void main(String[] args) {
                //isZhi(13);
                isZhi(96);

你的boolean是封装类型的 返回值是null
回复 使用道具 举报
局部变量在声明和首次提及的时候是无需赋值的,当首次被调用的时候才会去甄别是否已有。
回复 使用道具 举报
孤单背影 来自手机 中级黑马 2015-10-23 11:13:13
38#
局部变量在使用的时候是必须先赋值再使用
回复 使用道具 举报
只要你在用这个变量之前给他赋过初始值就行
你能不能给我举个具体的例子  不然我不好说
回复 使用道具 举报
月明 中级黑马 2015-10-29 01:03:34
40#
1312564637 发表于 2015-10-14 14:30
public static void main(String[] args) throws IOException {
       FileInputStream fi=new FileInputS ...

局部里的变量赋值可以分两步来做的 如果要用的时候就必须初始化 这里在while方法里使用 fi.read();给它赋了值 所以这里已经被初始化了 然后再看它是否等于-1  所以是在使用前已经被赋值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马