这是《Java2实用教程第五版》的试题答案,需要的同学评论关注加点赞
有问题可以在评论区提出
1.问答题
(1)什么叫标识符?标识符的规则是什么?false是否可以作为标识符?
用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列成为标识符。标识符由字母,下划线、美元符号和数字组成;第一个字符不能是数字,false 不是标识符,虽然false不是关键字,但它是Boolean类型的取值之一,有特定的意义。
(2)什么叫关键字?true 和 false 是否是关键字?请说出6个关键字。
关键字就是Java语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来用。true 和 false 都不是关键字。其他的关键字举例:class (类) implements(实现接口) interface(接口类) enum (枚举)extends(继承)abstract(抽象类或抽象方法)
(3)Java的基本数据类型都是什么?
boolean,char,byte,short,int,long,float,double
(4)float 型常量和double型常量在表示上有什么区别?
float常量必须用F或f为后缀。double常量用D或d为后缀。但double常量允许省略后缀。
(5)怎样获取一维数组的长度,怎样获取二维数组中一维数组的个数?
一维数组名.length 二维数组名.length
2.选择题
(1)下列哪项字符序列可以作为标识符?
A.true B.default c._int D.good-class
答案:C
根据标识符的命名规则,A和B为关键字无法作为标识符,D含有“-”是非法的。
(2)下列哪三项是正确的float变量的声明?
A.float foo=-1;
B. float foo=1.0
C. float foo=42e1;
D.float foo=2.02f
E.float foo=3.03d;
F.float foo=0x0123;
答案:ADF
B的1.0为double型变量
赋值给float变量需要强制类型转换:float foo=(float)1.0或者是加后缀f
C也是同理
而E的3.03d本身就是不存在的写法
F是16进制写法是可以的。
Java中,像1.0这种小数,后面什么都没有
默认属于double类型。1.0F才是float类型
(3)下列哪一项是正确的?
A. char 型字符在Unicode 表中的位置范围是0-32767。
B. char 型字符在Unicode 表中的位置范围是0-65535。
C.char 型字符在Unicode 表中的位置范围是0-65536。
D.char 型字符在Unicode 表中的位置范围是-32768~32767。
答案:B
char是两个字节的,在c语言中是-32768~32767,Unicode表是从0开始到65535,要注意在Java中是没有unsigned类型的。
(4)以下哪两项是正确的char 型变量声明?
A.char ch=”R”;
B.char ch =’\’;
C.char ch =’ABCD’;
D.char ch = “ABCD”;
E.char ch =’\ucafe’;
F.char ch =’\u10100’;
答案:BE
首先AD是必错了,因为双引号的原因;其次char是存放单个字符的
所以C是也是错的、双引号为String字符串类型
E和F是\u开头代表是Unicode
而Unicode的范围是从0000~FFFF所以F错了E是对的
F超出了Unicode表示范围、16进制后面只能带四位,是BE
最后是B,\是转义字符如果要使用的话必须是双\
所以这两个\其实在保存的时候就等于一个\
(5)下列程序中哪些【代码】是错误的?
public class E{
public static void main(String args[]){
int x=8;
byte b =127; //【代码1】
b=x; //【代码2】
x=12L; //【代码3】
long y=8.0; //【代码4】
float z=6.89; //【代码5】
}
}
【代码2】【代码3】【代码4】【代码5】都是错的。
代码2把int变量赋值给byte变量,大转小,需要强制类型转换
代码3同理long 转int
代码4不能把浮点型变量赋值给整型变量
代码5需要有后缀f否则默认是double类型
(6)对于int a[] = new int [3];下列哪个叙述是错误的?
A. A.length的值是3
B.a[1]的值是1
C.a[0]的值是0
D. a[a.length-1]的值等于a[2]的值
答案B
Java里声明数组的语法和C是有一些区别的,C里我们可以直接声明int a[10]
而在Java里我们需要先声明数组int a[]
再用new关键字给数组分配元素a=new int[3]
这是因为数组是引用类型的
数组名就是首个元素的地址
也就是引用(对象)创建数组后默认元素的值都为0
可以使用数组名.length返回数组的长度
3.阅读或调试程序
(1)上机运行下列程序,注意观察输出的结果。
public class E{
public static void main(String args[]){
for(int i=20302;i<=20322;i++){
System.out.println((char)i);
}
}
}
程序使用了一个循环语句,输出的是(char)20302的值,输出的实际上是Unicode表中第20302个字符,运行结果为“低”
(2)上机调试下列程序,注意System.out.print()和System.out.println()的区别。
public class OutputData{
public static void main(String args[]){
int x=234,y=432;
System.out.println(x+"<"+(2*x));
System.out.print("我输出结果后不回车");
System.out.println("我输出结果后自动回车到下一行");
System.out.println("x+y="+(x+y));
}
}
System.out.print()输出后不回车,而System.out.println()输出后会自动回车
(3)上机调试下列程序,了解基本数据类型数据的取值范围。
public class E{
public static void main(String args[]){
System.out.println("byte取值范围"+Byte.MIN_VALUE+"至"+Byte.MAX_VALUE);
System.out.println("short取值范围"+Short.MIN_VALUE+"至"+Short.MAX_VALUE);
System.out.println("int取值范围"+Integer.MIN_VALUE+"至"+Integer.MAX_VALUE);
System.out.println("long取值范围"+Long.MIN_VALUE+"至"+Long.MAX_VALUE);
System.out.println("float取值范围"+Float.MIN_VALUE+"至"+Float.MAX_VALUE);
System.out.println("double取值范围"+Double.MIN_VALUE+"至"+Double.MAX_VALUE);
}
}
了解基本数据类型数据的取值范围
(4)下列程序标注的【代码1】和【代码2】的输出结果是什么?
public class E {
public static void main(String args[]) {
long[] a = { 1, 2, 3, 4 };
long[] b = { 100, 200, 300, 400, 500 };
b = a;
System.out.println("数组b的长度:" + b.length); //【代码1】
System.out.println("b[0]=" + b[0]); //【代码2】
}
}
【代码1】:4、【代码2】:b[0]=1
数组属于引用型变量
因此两个相同类型的数组如果具有相同的引用,他们就有完全相同的元素。
因此当执行b = a时候,系统会释放最初分配给b的元素后
b和a指向相同的内存地址(引用相同)
所以b的长度就是a的长度为4,b[0]=a[0]=1。
我们在C语言中学过指针,指针就是地址
而Java中的引用就和指针十分相似
区别在于指针可以修改例如p++,而引用是无法修改的
在牺牲了灵活性的前提下提升了程序的安全性
(5)下列程序标注的【代码1】和【代码2】的输出结果是什么?
public class E {
public static void main(String args[]) {
int[] a = { 10, 20, 30, 40 }, b[] = { { 1, 2 }, { 4, 5, 6, 7 } };
b[0] = a;
b[0][1] = b[1][3];
System.out.println(b[0][3]); //【代码1】
System.out.println(a[1]); //【代码2】
}
}
答案:【代码1】:40 【代码2】:7
int[] a = { 10, 20, 30, 40 }, b[] = { { 1, 2 }, { 4, 5, 6, 7 } };
我们要注意这条语句,a是一个一维数组,元素分别是10,20,30,40
而b是一个二维数组(相当于int[]b[]这种格式)
二维数组中每一个元素都是一个一维数组
而Java的特点是二维数组中的一维数组的长度是没有限制的
是按照你所赋值的最大长度来计算
所以第一个元素为1,2,0,0、第二个元素为4,5,6,7
我们可以把二维数组看成一个矩阵第一个下标代表行第二个下标代表列
所以数组b可以看成、如下图
1、b[0]=a相当于把a的引用赋值给b[0](b[0]看成一个一维数组),结果变成了
2、b[0][1] = b[1][3],这样b就变成了
3、所以输出b[0][3]的值为30
那么问题在于a[1]的值为何是7而不是20呢?
是因为a中的值也被修改了
原因就在于a的引用赋值给了b[0]
那么b[0]和a指向同一块内存地址
那么如果修改了b[0]中的值,a的值也会跟着相应的改变。
4.编程题
(1)编写一个应用程序,给出汉子”你”、“我“、“他”在Unicode表中的位置
public class chapter1 {
public static void main(String[] args){
System.out.println("hi");
char A='你',B='我',C='他';
System.out.println("汉字\'你'在unicode表中的位置:"+(int)A);
System.out.println("汉字\'我'在unicode表中的位置:"+(int)B);
System.out.println("汉字\'他'在unicode表中的位置:"+(int)C);
}
}
(2)编写一个Java应用程序,输出全部的希腊字母
public class chapter1 {
public static void main(String[] args){
//输出小写希腊字母
int firstLetter, lastLetter;
char firstG = 'α', lastG = 'ω'; //获取首字母与末字母的值
firstLetter = (int)firstG;
lastLetter = (int)lastG;
System.out.println("希腊字母表: ");
for(int i = firstLetter; i <= lastLetter; ++i)
{
char greekLetter;
greekLetter = (char)i;
System.out.print(" "+greekLetter);
}
System.out.println();
}
}
public class chapter1 {
public static void main(String[] args){
//输出小写希腊字母
int startPosition = 0, endPosition = 0;
char cSrart = 'α', cEnd = 'ω';
startPosition = (int) cSrart;
endPosition = (int) cEnd;
System.out.println("希腊字母表:");
System.out.println("小写:");
for (int i = startPosition; i <= endPosition; i++) {
char c = '\0';
c = (char) i;
System.out.print(" " + c);
if ((i - startPosition + 1) % 10 == 0) {
System.out.println("");
}
}
//输出大写希腊字母
System.out.println();
cSrart = 'Α';
cEnd = 'Ω';
startPosition = (int) cSrart;
endPosition = (int) cEnd;
System.out.println("大写:");
for (int i = startPosition; i <= endPosition; i++) {
char c = '\0';
c = (char) i;
System.out.print(" " + c);
if ((i - startPosition + 1) % 10 == 0) {
System.out.println("");
}
}
}
}