首页 > 试题广场 >

程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存

[不定项选择题]
程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,正确的是()
  • 根据作用域规则,在函数中定义的变量只能在函数中引用
  • 在函数中定义的变量,其生存期为整个程序执行期间
  • 在函数中定义的变量不能与其所在函数的形参同名
  • 在函数中定义的变量,其存储单元在内存的栈区
这里主要说明D为什么是对的
首先说明栈内存和堆内存里存放的是什么
  • 栈内存中存放函数中定义的一些基本类型的变量和对象的引用变量;
  • 堆内存中存放new创建的对象和数组。

简单的来说,堆主要是用来存放对象的,栈主要是用来执行程序的
这么做是因为
  • 栈的存取速度快,栈数据可以共享,但是栈中的数据大小和生存期必须确定,缺乏灵活性中存放一些基本类型的对象和对象句柄
  • 堆是操作系统分配给自己内存,由于从操作系统管理的内存分配,所以再分配和销毁时都需要占用时间,因此用堆的效率非常低,但是优点在于编译器不需要指导从堆里分配多少存储控件,也不需要知道存储的数据要再堆里停留多长事件,因此用堆保存数据时会得到更大的灵活性
参考链接:https://blog.csdn.net/wangbo1998/article/details/80379016
发表于 2019-06-27 19:41:24 回复(25)
我选的ACD,牛马答案给的AB。用友的题我就没做对过几道
发表于 2022-08-12 21:58:25 回复(15)
C选项

发表于 2020-02-20 21:23:03 回复(18)
这题给的答案为AB,有问题吧,函数中定义的变量,生存期怎么会是整个程序执行期间?
发表于 2022-04-19 15:08:34 回复(10)
D选项不太严谨,如果定义的是引用类型变量,且没有通过逃逸分析,则可能会被分配到堆中,逃逸分析是jdk1.8默认开启的
发表于 2020-08-06 09:27:28 回复(6)
如果顺着答案来分析我只能这样分析:
A:局部变量无法被外部引用。
B:局部变量随着函数的结束而结束其生命周期,如果说生存期在整个程序执行期间我只能想着是局部引用变量的回收。
C:作用域相同的两个变量不能同名,唯一例外我只在局部内部类里能定义和形参同名的变量,但是我不知道是否符合函数中定义这一描述
如果符合的话,感觉很多东西都可以挂到内部类上导致脱离了本来的意义。
D:基本类型在栈内,引用类型在堆内。
发表于 2022-06-23 21:56:32 回复(0)
关于c选项的测试:
1、在函数体内部同名

2、在函数体中的代码块中同名

结论:在函数中,不管中间隔了几层,都不允许定义一个与形参同名的变量。
发表于 2020-10-19 21:59:21 回复(2)
不要什么牛马题目都加进来🤑
发表于 2022-06-30 07:55:55 回复(0)
java的不应该是ACD????
发表于 2022-04-26 10:49:52 回复(1)
函数中定义的变量,生存期为从函数被调用的时刻到函数返回调用处的时刻(静态局部变量除外)。
发表于 2019-06-03 16:16:08 回复(2)
这答案你确定?
发表于 2022-05-16 17:40:12 回复(0)
官方答案是AB 靠谱么
发表于 2022-04-22 20:27:55 回复(0)
储存单元是什么瘠薄
发表于 2019-09-18 03:54:30 回复(3)
b,明明函数执行完就没了,为啥存在于整个程序执行期间还是对的?
发表于 2022-07-20 22:15:29 回复(0)
C选项:因为形式参数是定义在每个方法栈里面的,也就是 形式参数的作用域是在这个方法栈中使用,而Java中规定同作用域内的参数不能够同名称
发表于 2022-01-25 15:48:45 回复(2)
我觉得D选项,在函数中定义的变量,一般是在栈中的,可是如果这个变量是用final修饰的话,不是应该在堆中吗?final修饰之后就相当于常量了呀!
发表于 2021-07-07 23:04:25 回复(2)
A.函数中定义的变量是局部变量,作用域为当前函数或循环等
B.局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了

发表于 2019-12-10 11:34:27 回复(0)
我说说我的看法,要是有哪些说的不对的地方,欢迎斧正!
  • A、根据作用域规则,在函数中定义的变量只能在函数中引用
  • B、在函数中定义的变量,其生存期为整个程序执行期间
  • C、在函数中定义的变量不能与其所在函数的形参同名
  • D、在函数中定义的变量,其存储单元在内存的栈区 
选项A,我稍微翻译一下,翻译成局部变量的作用域在其所在的方法体中,这样是不是就很好理解了!
选项B,我觉得说的不太严谨,整个程序范围也太大了,我觉得应该说线程的执行期间还比较严谨一点,因为假如这个程序有两个前台线程:线程A和线程B,而这个函数中定义的变量是存在线程A的栈中,当线程A执行结束释放资源,这时变量也就消失了,而线程B还活着,只要有一个前台线程存在,程序就不会结束,也就是说程序还没结束!
选项C,先声明没有阴阳怪气的意思,也不是想咬文嚼字哈!这个选项正常来说我们理解就是函数有个形参(例如int a),然后在函数体里再声明一个同名的变量(int a)不管是不是相同类型的,重复声明一个同名的变量就是不对的!但是我看见有人说在函数里的局部内部类里就可以定义与函数形参同名的变量。这样做确实可以,但这样我觉得就不叫函数中的变量与形参同名了,而是局部内部类的成员变量与形参同名。
选项D,先说说栈,栈是由栈帧组成的,每调用一个方法,栈就会压入一个栈帧(包含局部变量表、操作数栈、方法出口等),而局部变量表存储的八种基本数据类型和引用类型。当我们在函数中定义一个变量,假如这个变量时基本类型,那就是将这个基本类型的值存在栈帧中的局部变量表中;假如这个变量是引用类型的,那么new实例时这个实例对象是在堆中分配内存的,并且变量在栈帧的局部变量表中保存这个实例对象在堆中的地址值。所以说到底就是选项D没说清楚,导致存在歧义。
希望不要怪我罗嗦了一大堆也没给出个确切的答案哈!授人以鱼不如授之以渔,我提供我的思路给大家参考参考,希望能抛砖引玉!
发表于 2023-08-20 01:45:08 回复(0)
我觉得c选项可以看成形参和局部变量都在方法栈区,所以不能重名
发表于 2020-07-14 17:43:24 回复(0)
JAVA中b错误
发表于 2022-08-25 22:56:11 回复(0)