首页 > 试题广场 >

下面关于变量及其范围的陈述哪些是不正确的()

[不定项选择题]
下面关于变量及其范围的陈述哪些是不正确的()
  • 实例变量是类的成员变量
  • 实例变量用关键字static声明
  • 在方法中定义的局部变量在该方法被执行时创建
  • 局部变量在使用前必须被初始化
C:在方法中定义的局部变量在该方法被执行时创建
是错误的
不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建”
栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出口”四个部分。
举例说明:
public class Demo {
	
	public void test() {
		int a;
		int b = 5;
		int c = b + 4;
		a = 2;
	}
	
	public static void main(String[] args) {
		Demo demo = new Demo();
		demo.test();
	}
}
定义了一个Demo类,其中有一个测试主方法main以及一个test()方法
那么在执行main的时候,内存分配如下

其中我们只看test()桢栈中具体的流程
首先我们使用javac Demo.java来生成Demo.class文件,然后通过执行javap -c Demo来查看执行原理,这里我只截取test()方法部分

其中
0:iconst_5,表示将一个int类型的常量5,压入操作数栈中

1:istore_2,表示将这个int值从栈中取出,存储到局部变量_2中(代码为变量b)

2:iload_2,表示将变量2,int类型的值取出,压到操作数栈

3:iconst_4,表示将一个int类型的常量4,压入操作数栈中


4:iadd,执行int类型的加***将操作数栈的4和5从栈中弹出并相加,将结果压入操作数栈中

5:istore_3,表示将这个int值从栈中取出,存储到局部变量_3中(代码为变量c)

6:iconst_2,表示将一个int类型的常量2,压入操作数栈中

7:istore_1,表示将这个int值从栈中取出,存储到局部变量_1中(代码为变量a)

8:return,方法结束,返回

以上可以看出,虽然int a;在第一行就声明了a变量,但是直到给a赋值之后,才会在局部变量表中给a分配内存空间
我们可以把赋值的代码删掉,再看看执行流程
public class Demo {
	
	public void test() {
		int a;
		int b = 5;
		int c = b + 4;
	}
	
	public static void main(String[] args) {
		Demo demo = new Demo();
		demo.test();
	}
}


这次我们可以看出,并没有对a就行任何操作,也就证明了“只有当给变量赋值的时候才会分配内存空间”的说法。
以上


ps:我也是刚刚学到这里,如有说的不对之处望大家指出,一起探讨学习
参考:
[小白都能看得懂的Java虚拟机内存模型]https://zhuanlan.zhihu.com/p/98337005
[通过javap命令分析java汇编指令]https://www.jianshu.com/p/6a8997560b05

编辑于 2020-02-05 16:50:19 回复(47)
A.类的成员变量包括实例变量类变量(静态变量),成员方法包括实例方法和类方法(静态方法)。 A正确
B.类变量(静态变量)用关键字static声明,B错误
C.方法中的局部变量在方法被调用加载时开始入栈时创建,方法入栈创建栈帧包括局部变量表操作数栈,局部变量表存放局部变量,并非在执行该方法时被创建,C错误
D.局部变量被使用前必须初始化,否则程序报错。D正确
编辑于 2019-12-17 18:15:47 回复(13)
c选项应该是在线程为该方法创建栈桢时被创建,而不是方法执行时创建
编辑于 2019-09-17 08:17:02 回复(1)
C选项     在调用该方法再声明该局部变量并初始化的时候,该局部变量被创建并分配内存空间;直到该方法调用结束局部变量也就结束了;并不是一执行该方法就创建
发表于 2019-10-23 09:55:26 回复(0)
不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建” 栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出口”四个部分。
发表于 2021-07-02 00:15:02 回复(0)
选了AD的开个赞,真是佩服我自己的眼睛
发表于 2022-01-14 19:30:20 回复(0)
实例变量是对象变量,生成对象才被分配存储空间,也叫类成员变量
类变量采用static修饰


发表于 2019-10-04 20:24:39 回复(0)
类的成员变量是包括实例变量和类变量的;
方法中的局部变量是在方法被调用加载时就已经创建了,不是等到方法执行时创建
发表于 2022-04-20 10:36:40 回复(0)
1、实例变量是被实例化类的成员变量,对
2、static声明为类公用变量,错
3、方法中定义的局部变量在局部变量被入栈执行时创建,错
4、局部变量使用前必须初始化,对

发表于 2021-12-28 10:44:16 回复(0)
C的解析,创建栈帧 ,不就是 执行到调用该方法的时候创建局部变量吗
发表于 2020-12-28 14:32:27 回复(0)
哪位大神能解答一下A为什么是对的?感激不尽……
发表于 2019-12-16 08:30:17 回复(2)
A.类的成员变量除了实例变量还有类变量(用static修饰的变量)
B.类变量(静态变量)用关键字static声明,B错误
C.方法中的局部变量在方法被调用加载时开始入栈时创建,方法入栈创建栈帧包括局部变量表操作数栈,局部变量表存放局部变量,并非在执行该方法时被创建,C错误
D.局部变量被使用前必须初始化,否则程序报错。D正确
发表于 2022-07-03 00:00:32 回复(0)
c
是在执行到声明局部变量处才被创建,而不是执行方法或调用方法时才创建
发表于 2022-03-31 09:11:36 回复(0)
c 方法加载时创建
发表于 2021-03-01 20:24:21 回复(0)
C:在方法中定义的局部变量在该方法被执行时创建 是错误的 不是局部变量在该方法被执行/调用时创建,而是应该为在该变量被声明并赋值时创建,可以理解为“当代码执行到该变量被赋值的代码时才被创建” 栈会为每个方法在运行的时候分配一块独立的栈帧内存区域,栈帧又包含“局部变量表”、“操作数栈”、“动态链接”以及“方法出口”四个部分。
发表于 2020-06-23 14:51:56 回复(0)
类的成员变量包括实例变量类变量(静态变量),成员方法包括实例方法和类方法(静态方法)
发表于 2020-02-28 15:25:05 回复(0)

局部变量存储在栈帧中,而虚拟机会在方法被执行时创建栈帧,C选项为什么是错误的?


发表于 2019-11-24 10:56:57 回复(0)
实例变量属于对象,必须实例化之后才能使用;类变量属于类,用static修饰,直接类名.变量就能调用。
发表于 2019-10-21 10:29:48 回复(0)

成员变量会被系统默认初始化,局部变量没这功能,所以必须自己初始化。
还要注意静态成员变量也没系统默认初始化,必须在初始化块或者定义时或者构造函数里进行手动初始化
发表于 2019-07-25 10:21:01 回复(4)
变量分为局部变量和成员变量,其中成员变量包括实例变量,静态变量(类变量)。
发表于 2023-06-04 11:31:05 回复(0)