课后作业1
从测试中看不足
1.JAVA的基本运行单位是类还是方法?
解答:JAVA的基本运行单位是类。在逻辑上,方法属于对象或者类,不能独立存在,没有只有方法的程序。
2.类由什么组成?
解答:类由两部分组成:属性(特征)和方法(行为)
3.变量的类型,相互之间可以转换吗?
解答:变量的类型,相互之间可以转换。
1)自动类型转换:低级变量直接转为高级变量
变量低级->高级:byte->short->int->long->float->double,char->int->long->float->double
2)强制类型转换:高级变量转为低级变
转换格式:(targetType)value
3)表达式类型的自动提升:
所有的byte类型,short类型和char类型将被提升到int类型,整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
4.String是一个数据类型吗?
解答:String不是一个数据类型。JAVA中String是一个对象,是特殊的引用类型。基本数据类型只表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为 。
5.static代表的含义?
解答:static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
仔细阅读示例:
package qiaodaima; public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t); //是原始数据类型吗? System.out.println(s.getClass().isPrimitive()); //从字符串中转换 Size u=Size.valueOf("SMALL"); System.out.println(s==u); //true //列出它的所有值 for(Size value:Size.values()) { System.out.println(value); } } } enum Size{SMALL,MEDIUM,LARGE};
运行它,分析运行结果,你能得到什么结论,你掌握了枚举类型的基本用法了吗?
解答:
运行截图如下:
结果分析&结论总结:
①System.out.println(s==t); 输出为false,s和t引用的不是同一对象。枚举类型中,引用相同值时引用的对象相同。
②System.out.println(s.getClass().isPrimitive());输出为false,s属于枚举类型。枚举类型不是原始数据类型。
③System.out.println(s==u); 输出为true,s和u引用的值都是是"SMALL"是同一对象。
④System.out.println(value);输出为SMALL,MEDIUM,LARGE,枚举value中的值。
枚举的基本知识点:
用“==”和“equals()”比对枚举变量的值;
引用相同值时引用的对象相同;
枚举需要将字串转化为枚举,Java中除了int,float等几个基本数据类型,其余的数据类型都用来引用对象。;
枚举类型不是原始数据类型;
阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
解答:
原码:十进制数字的绝对值转化为8位(byte类型为8位,int类型则是36位)的二进制数字。如果十进制的数字是正数,则原码首位为0,负数则原码首位为1。
反码:若为正数,反码==原码;
若为负数,最高位保持不变,其他的数值位1变成0,0变成1;
补码:若为正数,反码==原码;
若为负数,把负数的反码+1就得到了补码;
编写代码如下:
int a=9; int b=-9; int sum=a+b; System.out.println(sum);
易知程序的结果为0。
原码:(00001001)原+(10001001)原=(10010010)原,换算成十进制为-18,与结果不符。
反码:(00001001) 反+ (11110110)反 = (11110111)反,换算成十进制为8,与结果不符。
补码:(00001001)补 + (11110111)补 = (11111111)补 ,换算成十进制为0,与结果符合。
故在java中,数是由补码表示的。
Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识。
解答:在函数里面的赋值优先于在函数外赋值,属于局部变量。函数外的赋值可以赋给类中的多个函数,属于全局变量。如果函数里面没有重复的赋值,那么函数的值为函数外的。
看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
解答:自动类型转换是安全的,强制类型转换时,可能会引起信息的损失。实线代表无精度损失,虚线代表有精度损失,一般来说在实线两端都是由低精度指向高精度的类型,所占的位数从低到高,范围从小到大,所以可得出,低精度向高精度转化不丢失精度,反之,从高精度传向低精度则会损失。
请运行以下代码(TestDouble.java),你看到了什么样的输出,意外吗?
import java.util.Scanner; public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); System.out.println("4.015 * 100 = " + (4.015 * 100)); System.out.println("123.3 / 100 = " + (123.3 / 100)); } }
结果截屏如下:
解答:意外,使用double类型的数值进行计算,结果是不精确的。
为什么double类型的数值进行运算得不到“数学上精确”的结果?
解答:Double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差,简单地说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来,而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
以下代码的输出结果是什么?为什么会有这样的输出结果?
int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y");
结果截屏如下:
解答:在System.out.println()中,如果在string字符串后面是+和变量,会把变量转换成string类型,加号起连接作用,然后把两个字符串连接成一个新的字符串输出;如果先有变量的加减运算再有字符串,那么会从左到右先计算变量的加减,然后再与后面的string结合成一个新的字符串。也就是说加号只有在两个string类型或者其中一个是string类型的时候才起到连接作用,否则仍然是运算符。