Java选择题练习:常量变量
1.在jdk1.5之后,下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
正确答案: B A true,false B true,true C false,true D false,false E 对于不同的环境结果不同 F 程序无法执行
解析: 本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上),下面的讨论都不针对新开辟对象的情况: 1、基本型和基本型封装型进行“”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true; 2、两个Integer类型进行“”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。 3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true 4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。
2.可以将布尔值与整数进行比较吗 ?
正确答案: B A 可以 B 不可以
解析:不是一个类型
3.以下哪几种是java的基本数据类型
正确答案: B C A String B int C boolean D Double
解析:Double在java.lang包,是double的一个包装类,不是基本数据类型
4.枚举(enum)属于原始数据类型(primitive type)。
正确答案: B A 正确 B 错误
解析:在Java中,变量有两种类型,一种是原始类型,一种是引用类型。 原始类型一共有8种,它们分别是char,boolean,byte,short,int,long,float,double。在Java API中,有它们对应的包装类,分别是(首字母大写)Character,Boolean,Byte,Short,Integer,Long,Float,Double(char,int的变化稍微大点)。
JAVA JVM对于不同的原始类型会分配不同的存储空间,具体分配如下:
-
byte : 1个字节 8位 最大值: 127 (有符号) -
short : 2个字节 16位 32767 -
int : 4个字节 32位 2147483647 -
long: 8个字节 64位 9223372036854775807 -
float: 4个字节 32位 3.4028235E38 -
double:8个字节 64位 1.7976931348623157E308
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示,是特殊的类,可以拥有成员变量和方法。
5.程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,()是正确的。
正确答案: A C D A 根据作用域规则,在函数中定义的变量只能在函数中引用 B 在函数中定义的变量,其生存期为整个程序执行期间 C 在函数中定义的变量不能与其所在函数的形参同名 D 在函数中定义的变量,其存储单元在内存的栈区
解析:说明D为什么是对的 首先说明栈内存和堆内存里存放的是什么
- 栈内存中存放函数中定义的一些基本类型的变量和对象的引用变量;
- 堆内存中存放new创建的对象和数组。
简单的来说,堆主要是用来存放对象的,栈主要是用来执行程序的 这么做是因为
- 栈的存取速度快,栈数据可以共享,但是栈中的数据大小和生存期必须确定,缺乏灵活性中存放一些基本类型的对象和对象句柄
- 堆是操作系统分配给自己内存,由于从操作系统管理的内存分配,所以再分配和销毁时都需要占用时间,因此用堆的效率非常低,但是优点在于编译器不需要指导从堆里分配多少存储控件,也不需要知道存储的数据要再堆里停留多长事件,因此用堆保存数据时会得到更大的灵活性
6.Consider the following code:
Integer s=new Integer(9);
Integer t=new Integer(9);
Long u=new Long(9);
Which test would return true?
正确答案: C D E A (s == u) B (s == t) C (s.equals(t)) D (s.equals(9)) E (s.equals(new Integer(9))
解析:
-
int和int之间,用==比较,肯定为true。基本数据类型没有equals方法 -
int和Integer比较,Integer会自动拆箱,== 和 equals都肯定为true -
int和new Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true -
Integer和Integer比较的时候,由于直接赋值的话会进行自动的装箱。所以当值在[-128,127]中的时候,由于值缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是直接从缓存中获取已经创建好的Integer对象。而当大于这个区间的时候,会直接new Integer。 -
当Integer和Integer进行==比较的时候,在[-128,127]区间的时候,为true。不在这个区间,则为false -
当Integer和Integer进行equals比较的时候,由于Integer的equals方法进行了重写,比较的是内容,所以为true -
Integer和new Integer : new Integer会创建对象,存储在堆中。而Integer在[-128,127]中,从缓存中取,否则会new Integer. 所以 Integer和new Integer 进行==比较的话,肯定为false ; Integer和new Integer 进行equals比较的话,肯定为true -
new Integer和new Integer进行==比较的时候,肯定为false ; 进行equals比较的时候,肯定为true 原因是new的时候,会在堆中创建对象,分配的地址不同,==比较的是内存地址,所以肯定不同 -
装箱过程是通过调用包装器的valueOf方法实现的 -
拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型) -
总结:Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。 而Float和Double则不相等, Boolean的值总是相等的
7.Java类Demo中存在方法func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( )
public class Demo{
float func1()
{
int i=1;
return;
}
float func2()
{
short i=2;
return i;
}
float func3()
{
long i=3;
return i;
}
float func4()
{
double i=4;
return i;
}
}
正确答案: A D A func1 B func2 C func3 D func4
解析: 这道题考的是数据类型转换问题。由大到小需要强制转换,由小到大不需要。 A:return; 没有返回值,错误 B:short → float 无须强制转换,正确 C:long → float 无须强制转换(这个最选项容易出错),正确。 float占4个字节为什么比long占8个字节大呢,因为底层的实现方式不同。 浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。 第1位,符号位,即S 接下来8位,指数域,即E。 剩下23位,小数域,即M,取值范围为[1 ,2 ) 或[0 , 1) 然后按照公式: V=(-1)^s * M * 2^E 也就是说浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来,通过这个公式虽然,只有4个字节,但浮点数最大值要比长整型的范围要大。 D:double → float 没有强制转换,错误。
8.以下程序段的输出结果为:
public class EqualsMethod {
public static void main(String[] args)
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.print(n1 == n2);
System.out.print(",");
System.out.println(n1 != n2);
} }
正确答案: B A false,false B false,true C true,false D true,true
解析:使用Integer a = 1;或Integer a = Integer.valueOf(1); 在值介于-128至127直接时,作为基本类型。 使用Integer a = new Integer(1); 时,无论值是多少,都作为对象。
9.以下表达式中,正确的是()
正确答案: C D A byte i=128 B boolean i=null C long i=0xfffL D double i=0.9239d
解析: A、byte:-128~127。直接给个128,编译器会认为是int值,这个时候需要强转成byte。 B、boolean:这可是基本数据类型啊,只有false,true。默认值是false。一旦是包装类Boolean,那默认值是null。ojbk C、十六进制没毛病 D、double这个东西本来就可以写成有d的形式。
|