为了能到远方,脚下的每一步都不能少.|

lmyyyy

园龄:2年8个月粉丝:7关注:10

动手动脑课后实验

一、从测试看不足

1、JAVA的基本运行单位是类还是方法?

Java程序的基本单位是类,你建立类之后,就可用它来建立许多你需要的对象。Java把每一个可执行的成分都变成类。

2、类由什么组成?

Java中的每个类一般包含属性、构造器、块、方法、内部类五部分。1.属性:用来定义对象的数据;2.构造器:构造器也是方法,每一个类中都一定会有构造器,包含有参构造器和无参构造器每一个对象在创建的时候都会调用构造器,如果没有构造器,系统将提供一个默认的空构造;构造器没有返回值,没有void;构造器的名字必须和类名保持一致。3.块:能够用来在类加载时执行操作或者在每次实例化前执行通用操作;5.方法:用来定义对象的行为;方法名是任意合法的标识符。返回值类型是方法的返回数据的类型,如果返回值类型为void,表示没有返回值。参数列表可包含0个或多个参数,参数之间以","分开。如果方法的返回类型是void,那么方法主体可以没有return语句,如果有return 语句,那么return语句不允许返回数据;如果方法的返回类型不是void,那么方法主体中必须包含return 语句,而且return语句必须返回相应类型的数据。6.内部类:

作为类的一个成员存在,能够访问外部类的属性和方法。
3、变量的类型,相互之间可以转换吗,浮点数?

变量的类型转换在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。自动类型转换自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。要实现自动类型转换,必须同时满足两个条件,第一个是两种数据类型彼此兼容。第二个是目标类型的取值范围大于源类型的取值范围。正向过程:由低字节向高字节自动转换。byte->short->int->long->float->double逆向过程:使用强制转换,可能丢失精度。inta=(int)3.14;强制类型转换强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。

4、String是一个数据类型吗?

String是不属于8中基本数据类型的,String是一个对象。这里补充下JAVA的8种基本数据类型:基本类型分为三类,字符型(char)、布尔型(boolean)、数值型(byte、short、int、long、float、double)。这里数值型又可以分为两种,整数型(int、short、long)和浮点型(float、double)。JAVA中数值类型不存在无符号的,他们的取值范围是固定的,不会随机器硬件环境或者操作系统的改变而改变。对象的默认值是null,所以String的默认值也是null。但它又是一种独特的对象,有自己独特的一些性质。new String()和new String("");都是声明一个空串,这是要注意声明的是空串而不是null。String str1="hello"; 和String str2= new String("hello");的区别:这里不去谈堆也没有涉及栈,只是先简单引入常量池的概念。常量池(constant pool)指的是在编译期间被确定,并被保存在已编译的.class文件中的一些数据,括了类、方法、接口等的常量,也包括字符串常量。解释下,java确保一个字符串常量只有一个拷贝,在例子中,s0和s1中的“kvill”都是字符串常量,在编译期就确定了,所以s0==s1为true。对于s2,“kv”和“ill”都是常量,当一个字符串常量由多个字符串常量相加得到时,它本身也是字符串常量。所以s2在编译期就被解析为一个字符串常量而得以确定,所以我们可以得出s0==s1==s2。但是用new String("kvill')建立的字符串不是一个常量,所以由new String()创立的字符串不放到常量池中。他们有各自的地址空间。String中的intern()函数。存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在量池中增加一个Unicode等于str的字符串并返回它的引用。String是不可变的。String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。综上,就是java中对String的一些理解。主要是参考的文章开头的链接那篇文章,有些东西我还没接触到,比如java虚拟机,所以对一些东西还是不懂得,准备看看这方面的书,有些人推荐这类书了。只是一直没看,得抓紧加油好好学习了!

 5、static代表的含义?

java中,static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,或者进行静态导包。static的特点:1、随着类的加载而被加载;2、优先于对象存在;3、被所有对象共享。Java是一种面向对象的计算机编程语言,Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。下面我将和大家讲讲Java中的static是什么意思。static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块

二、动手动脑

反码、补码跟原码几个概念。

1、原码、反码、补码的概念
原码 :最高位是符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制。

反码:正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。

补码:正数的补码与原码一致,负数的补码是对原码按位取反加1,符号位不变。

例如 十进制数字:5

5=2^2+2^0 101 至少要三位数字 加上符号位 就是4位数字

原码:0101

反码:0101

补码:0101

例如 十进制数字:-5

5=2^2+2^0 101 至少要三位数字 加上符号位 就是4位数字

原码:1101

反码:1010

补码:1011

例如 将补码1011 转换为原码

补码:1011

符号位不变,数值位取反:1100

1后得到原码:1101

补码变成原码的方式是:正数的补码与原码一致,负数的补码按位取反加1,符号位不变

反码变成原码的方式是:正数的反码与原码一致,负数的补码按位取反,符号位不变

2、原码、反码、补码 0的问题
4位二进制原码表示0:-0=1000 +0=0000

4位二进制反码表示0:-0=1111 +0=0000

4位二进制补码表示0:-0=0000 +0=0000

000 --> 0

111 --> 7

3、原码、反码、补码 表示范围
n+1位数字,绝对值最大的原码是 -(2^n - 1)和 2^n - 1

n+1位数字,绝对值最大的反码是 -(2^n - 1) 和 2^n - 1

n+1位数字,绝对值最大的补码是 -2^n

例如

原码:

二进制无符号000~111 十进制0~ 7 0 ~ 2^3-1

二进制有符号0000~0111 十进制0~7 0 ~ 2^3-1

二进制有符号1111~1000 十进制-7~0 -(2^3-1) ~ 0

综上所述:4位原码的表示范围: -(2^3 - 1) ~ 2^3-1

4位二进制原码表示的范围 1111~0111可以表示15个十进制数字 -(2^3 - 1) ~ 2^3-1

4位二进制反码表示的范围 1000~0111可以表示15个十进制数字 -(2^3 - 1) ~ 2^3-1

4位二进制补码表示的范围 1000~0111 可以表示16个十进制数字 -2^3 ~ 2^3-1

补码:位数一定,绝对值最大的补码是符号位是1,数值位全为0

4位补码数字表示 -8: 1000

4位数字,绝对值最大的原码是 1111 和 0111 -7和7 -(2^3-1) 和 2^3-1

4位数字,绝对值最大的反码是 1000和 0111 -7和7

4位数字,绝对值最大的补码是 1000 -2^3 -8

对一下十进制数字排序 从小到大

-001 001 -011 011 -101

-101<-011<-001<001<011

对一下二进制数字排序 从小到大

1001 0001 1011 0011 1101

1101<1011<1001<0001<0011

4、二进制转十进制
无符号二进制 十进制 1后的二进制 加1后十进制
1 2^1 – 1 10 2^1
11 2^2 – 1 100 2^2
111 2^3 – 1 1000 2^3
1111 2^4 – 1 10000 2^4
111……111 n个1 2^n – 1 1000……000 n个0 2^n
将原码:10101,01001 转成十进制数

10101 = -1*2^2 + 1*2^0

01001 = 1*2^3 + 1*2^0

三、你知道原因吗?

为什么double类型的数值进行运算得不到“数学上精确”的结果?

使用double无法得到数学上的精确结果的原因:

double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。不能用double来初始化BigDecimal:因为计算机01的方式对于十进制的0.1是无法精确表示的,所以对于double数字只能接近表示,如果用这个double来初始化bigDecimal的话就会出现同样的问题。

 

本文作者:lmyyyy

本文链接:https://www.cnblogs.com/lmyy/p/16685560.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   lmyyyy  阅读(87)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起