文档库

最新最全的文档下载
当前位置:文档库 > Java语言基础实验报告

Java语言基础实验报告

浙江大学城市学院实验报告

课程名称面向对象程序设计

实验项目名称Java语言基础实验

学生姓名专业班级学号

一. 实验目的和要求

1. 掌握Java语言的基本数据类型、字符串、数组

2. 掌握Java语言的运算符、表达式、语句

3.能够编写Java应用程序

二. 实验内容

1. 局部变量与final变量实验

2. 基本数据类型与转换实验

3. 算术运算的精度问题实验

4. 移位运算实验

5. 运算赋值实验

6. 短路逻辑运算实验

7. 编程实验:输出Unicode特定区间的字符。

8. 编程实验:分析输入的数字

三. 实验结果与分析(可将程序运行结果截屏,也可分析运行结果)

1. 局部变量与final变量实验。编写以下程序,并回答问题。

public class LocalVariableInitExample {

public static void main(String[] args) {

int a ;

System.out.print(a);

final int b = 100;

b++;

System.out.print(b);

}

}

(1)程序的错误

错误1:变量a定义之后没有赋值

错误2:变量b为final变量,定义赋值之后不能再修改变量的值

(2)改正方式

public class LocalVariableInitExample {

public static void main(String[] args) {

int a ;//改成int a=10;

System.out.print(a);

final int b = 100;

b++;//将此语句删除

System.out.print(b);

}

}

2. 基本数据类型与转换实验。编写以下程序,分析代码的输出结果,并回答问题。

class Test2{

public static void main(String[] args){

System.out.println("第1段测试代码输出");

System.out.println((byte)255);

System.out.println((short)65535);

System.out.println((byte)-129);

System.out.println((byte)129);

System.out.println((byte)128);

System.out.println("第2段测试代码输出");

int i = 123456789;

float f = i;

System.out.println(f);

long j = 123456789123456789L;

double d = j;

System.out.println(d);

System.out.println("第3段测试代码输出");

System.out.println(077);

System.out.println(0x77);

System.out.println(77);

}

}

请分析并回答以下问题:

(1)分析第1段代码,说明在什么情况下,int类型的数字转换为byte或者short类型,

会出现符号变化,即正数变负数,负数变正数?为何输出会不同?

答:当int类型所表示的数字大小大于byte以及short所能表示的最大的数字的时候将出现符号变化,补码在转化过程中的符号位的改变

(2)分析第2段代码,说明整数类型向浮点型转型是否可能出现精度损失,是否需要强

制转换。

答:可能出现精度损失,不需要强制转换

(3)分析第3段代码,说明整数的八进制、十六机制、十进制的书写格式(即字面值格

式)都是什么?

答:八进制:首字母为0,后面为0~7所组成的

十六机制:首字母为0x,后面为0~9和A~F所组成的

十进制:首字母不为0,由0~9之间的数字组成

3. 算术运算的精度问题实验。编写以下程序,并回答问题。

class Test3{

public static void main(String[] args){

short a = 10;

a = a + 2;

byte b = 1;

b = b + 1;

short a = 10;

byte b = 5;

a = a + b;

char c = 'a';

c = c+1;

}

}

(1)程序的错误

错误1 a+2将进行自动转化成int类型,所以不能将short类型的a+2 错误2 b+1将自动转化成int类型,故不能将byte类型的b等于b+1 错误3 a和b在之前已经定义过了,不能重复定义

错误4 不能将short类型的a等于自动升级转化为int类型的a+b

错误5 不能将char类型的c等于int类型的c+1

(2)改正方式

class Test3{

public static void main(String[] args){

short a = 10;

a = a + 2;//改成a=(short)(a+2);

byte b = 1;

b = b + 1; //改成b=(byte)(b+1);

short a = 10;//改成short d=10;

byte b = 5;//改成byte e=5;

a = a + b; //改成a=(short)(d+e);

char c = 'a';

c = c+1; //改成c=(char)(c+1);

}

}

4. 移位运算实验。编写以下程序,分析代码的输出结果,并回答问题。class Test4{

public static void main(String[] args){

System.out.println("第1段测试代码输出");

System.out.println(1>>32);

System.out.println(1L>>32);

System.out.println("第2段测试代码输出");

System.out.println(10>>5);

System.out.println(-10>>5);

System.out.println("第3段测试代码输出");

System.out.println(1<<31);

System.out.println(1L<<31);

System.out.println(1L<<63);

System.out.println("第4段测试代码输出");

System.out.println(1<<100);

System.out.println(1L<<100);

System.out.println("第5段测试代码输出");

System.out.println(7<<2);

System.out.println(7<<1<<1);

System.out.println("第6段测试代码输出");

int n = 34; int q=7;

System.out.println(q<

q= 7;

for(int i = 0;i

q = q<<1;

System.out.println(q);

System.out.println("第7段测试代码输出");

int m = 2000000000;

System.out.println(m<<1);

System.out.println(m*2);

System.out.println("第8段测试代码输出");

System.out.println(-2>>1);

System.out.println(-2>>>1);

}

}

请分析并回答以下问题:

(1)分析第1段代码,为何输出会不同?

答:System.out.println(1>>32);int类型的1向右移位

System.out.println(1L>>32);long类型的1向右移位

(1)分析第2段代码,正整数右移的最小值是什么?负整数右移的最大值是什么?

答:正整数右移最小值为0

负数右移最大值为-1

(2)分析第3段代码,三个语句输出为何不同?

答:System.out.println(1<<31); -2147483648因为1是int类型所以移动位数是31对32求余,也就是向左移动32位,将1从第0位移到了第31位符号位,而所有低位都补充为0 System.out.println(1L<<31); 2147483648因为是long类型所以移动位数是31对64求余,也就是向左移动31位

System.out.println(1L<<63); -9223372036854775808因为long类型向左移动63位,将1从第0位移到了第63位符号位,而所有低位都补充为0

(3)分析第4段代码,两个语句输出为何不同?

答:System.out.println(1<<100); 16就是int类型的1向左移动100对32取余个位数,就是左移4位

System.out.println(1L<<100); 68719476736就是long类型的1向左移动100对63取余个位数,就是左移37位

(4)分析第5段代码,两个移位运算是否等价?

答:等价

(5)分析第6段代码,q<

下相同?

答:不相同,只有当符号位没有改变的时候才会相同

(6)分析第7段代码,左移1位与乘2是否等价?左移1位是否一定值翻倍?

答:等价,不一定,如果是数为-1左移一位之后将变成0

(7)分析第8段代码,“-1>>1”和“-1>>>1”有何差别?

答:System.out.println(-2>>1); -1有符号右移1位,因为-2是负数,所以在高位补充1

System.out.println(-2>>>1); 2147483647无符号右移1位,高位统一补充0

5. 运算赋值实验。编写以下程序,并回答问题。

class Test5{

public static void main(String[] args) {

byte a = 10;

a = a >> 1; // 是否出错?

a >>= 1; // 是否出错?

char c = 'a';

c = c + 1;// 是否出错?

c += 1; // 是否出错?

}

}

(1)程序的错误

错误1:a为byte类型,在移位运算过程中会自动转化成int类型错误2:c为char类型,c+1将自动转化成int类型

(2)改正方式

class Test5{

public static void main(String[] args) {

byte a = 10;

a = a >> 1; //改成a=(byte)(a>>1)

a >>= 1;

char c = 'a';

c = c + 1;// 改成c=(char)(c+1);

c += 1;

}

}

(3)运算赋值的特点。

运算赋值的时候无需进行强制转换,因为其自动进行强制类型转换

普通赋值的时候要进行强制类型转换

6. 短路逻辑运算实验。编写以下程序,并回答问题。

class test6{

public static void main(String[] args) {

int x = 1, z = 2;

System.out.println("第1段测试代码输出");

if(false&&(x == (z = 1)))

System.out.println(x);

else

System.out.println(z);

z = 2; x =1;

System.out.println("第2段测试代码输出");

if(true&&(x == (z = 1))&&false)

System.out.println(x);

else

System.out.println(z);

x=0; z = 2;

System.out.println("第3段测试代码输出");

if(true||(x == (z = 1)))

System.out.println(z);

x=0; z = 2;

System.out.println("第4段测试代码输出");

if(false||(x == (z =1))||true)

System.out.println(z);

}

}

请分析并回答以下问题:

(1)第1段代码的输出结果是什么,为何?

答:2 因为if(false&&(x == (z = 1)))时因为第一个是false就没有计算(x == (z = 1)),z仍然为2

(2)第2段代码的输出结果是什么,为何?

答:1因为if(true&&(x == (z = 1))&&false) 时第一个是true故计算了(x == (z = 1)),z被赋值为1

(3)第3段代码的输出结果是什么,为何?

答:2 因为if(true||(x == (z = 1))) 没有计算x == (z = 1),z仍然为2

(4)第4段代码的输出结果是什么,为何?

答:1 因为if(false||(x == (z =1))||true)计算了x == (z = 1),z被赋值为1

7. 编程实验:输出Unicode特定区间的字符。功能要求:屏幕输出所有大写英文字母、小写字母)、某两个汉字字符之间的所有Unicode字符。

程序运行截图是:

8. 编程实验:分析输入的数字。功能要求:输入若干个数字,依次判断这些数字是否是奇数、平方数、素数,并输出判断信息。设计要求:需要设计静态方法isOdd(int n)来判断参数n是否是奇数;相似地,还需要设计静态方法isSquareNumber(int n)和isPrime(int n),来分别用于判断参数n是否是平方数、素数。

程序运行截图是:

四. 讨论、心得(可写遇到的问题及解决方法,或者对技术的理解等)

移位运算以及在赋值运算的时强制类型转化的一些细节以及规则性问题得到了解决