大家好,欢迎来到IT知识分享网。
一、基本数据类型及相互转换
1.1、基本数据类型
类型名 |
范围 |
存储大小 |
byte |
-128-127 |
8位带符号的数 |
short |
-32768~32767 |
16位带符号的数 |
int |
-2147483648~ |
32位带符号的数 |
long |
-~ |
64位带符号数 |
char |
‘\u0000’~’\uFFFF’ |
16位(Unicode编码,实际存储是采用UTF-8) |
float |
负数范围:-3.E+38~ -1.4E-45 正数范围:1.4E-45~-3.E+38 |
32位,标准IEEE754 |
double |
负数范围:-1.23157E+308~-4.9E-324 正数范围:4.9E-324~1.23157E+308 |
64位,标准IEEE754 |
boolean |
true或false |
1位 |
说明:
(1)一般在Long所表示的范围已经是很大了,但如果还是不够使用,在Java中有一个BigInteger(大整数)类用于帮助实现超大数的表示。
(2)byte(字节型)它是有符号的8位类型,数的范围是-128~127.当从网络或文件处理数据流的时候,字节类型的变量是特别有用的。Int类型和float类型都是使用4个字节来存储数据,但从他们能存储的最大数来看却不一样,原因在于int类型的4个字节可以很近精确的表示正负231中的任意数,而浮点数不能精确的表示某个小数,它存在一个舍入误差,例如[0,1]中的小数有无穷多个,但四个字节所能存储的数是有限的,即使用有限的数表示无穷多个数会存在误差。
在这里提一个问题:对于一个字节8位的数据来说,其可以表示的最大数为255,从0-255这个之间总共有256个数,但是在使用最高位表示符号为之后为什么负数要比正数多一个数?
对于这个问题,我们知道在计算机中数据都是使用补码表示的,正数的原码,反码,补码都是一样的;负数的反码在原码的基础上符号位不变其余各位取反,负数的补码在反码的基础上加一得到。我们知道8位可以表示的数据的个数是256个,正数和负数各取一般,正数取+0 ~ +127这128个数,负数就取-0~-127;然而为了数据区间连续性,+0和-0的补码表示都是0000 0000 然后0我们使用+0来表示了,因此-0我们代替-128,其实我们通过8位补码的规则是无法得到-128的补码的,这就是因为-128是用来代替-0 的。
(3)数的数据类型类型决定了该数可以进行什么样的运算,而不是该数的大小。【数的数据类型决定了这种数据类型所能表示的最大最小数和这种数据类型所能表示数值大小的范围,却无法决定这种数据类型数据的大小,因为我们不能说byte类型的127要比int类型的8要小】
(4)Java中使用2个字节(即16位)表示一个字符,特别注意的是Java支持的字符集是Unicode统一编码字符(Unicode统一编码字符包含ASCII码同时它还包含其他各种语言字符),也即在Java中可以使用Unicode字符集中的定义的任何语言字符。Char类型用来表示Unicode编码表中的字符,Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许65536个字符,也即char类型的变量可以存储中文汉字(中文汉字只能存储一个),这一点与C和C++不同,在C和C++是采用ASCII码表示字符,使用8位表示字符集,不能存储汉字,char是在0-65536范围,运算是直接当作整数来运算,可以把0-65535之间的整数直接转型为char,,单引号用来表示字符常量例如’A’是一个字符,他与”A”是不同的,”A”表示含有一个字符的字符串。
Java语言中还允许使用转移字符’\n’来将其后的字符转变为其他的含义,char c2 = ‘\n’;//代表换行,在Java中可以使用中文来对变量进行命名,如char 中国 = ‘中’;但char 中国 = ‘两个’;是错误的,因为char中只能存储一个汉字,存储多个汉字要是用String。
(5)在Java中使用byte和short进行算术运算是要注意,任何多个byte或short变量运算的结果都是32位的,即任意多个byte或short类型的变量运算的结果都是int类型,如short s1=1;s1 = s1+1;(这一点与C\C++不同。)这段代码会出现编译错误,而short s=1;s +=1;则不会出现编译错误,使用byte类型同样。原因在于s += 1;相当于++s;而自增自减运算符不会自动进行类型提升。而“+”作为两个数进行加法运算时会进行类型的提升,因此s++ 与 s +=1效果相同,但s +=1与s = s+1效果是不相同的。
(6)程序中出现的整形数据值都被称为整型直接量,其默认类型是int,如果整型直接量的值大于int型表示的数据范围,则需要在最后加上大写字母L或小写字母l,表示该整型直接量为long类型数据,即在整数常量的后面添加L,此时Java编译器会将该int类型常量自动转换成long类型的整型常量,例如:long a = 1234_5678_901;【注意在Java中可以使用下划线来分开数字】此时会报错,原因在于1234_5678_901超过了int类型的所能表示的范围,解决办法是在1234_5678_901后面加一个L,此时该整型常量是长整型整数常量,而长整型能表示这样的范围。
如果以十六进制的形式表示数据,则在数据前加上0(数字)X或0(数字)x;如需要以八进制的形式表示,则可在数字前面加上0(数字).0x10表示10进制的16,010表示十进制的8 将10进制的数转换为二进制:如 int 10;(10进制)使用Integer.toBinaryString(a);转换为二进制,使用Integer.toOctalString(a);转换为16进制,使用Integer.toHexString(a);转换为8进制。在JavaSE5.0前的浮点型只能使用十进制数值表示,从JavaSE5.0后可以使用十六制表示浮点数值,例如0.125可以表示为0x1.0p-3。在十六进制表示法中,使用“p”表示指数,而不是”e”。
(7)如果没有对变量进行正确的初始化就使用,在编译时Java编译器会报告错误信息。
浮点型直接量的默认类型是double类型,如要明确的表示浮点型直接量的类型是float类型,则需要在数字的最后加上一个字母F或f。这对float类型的变量初始化是非常重要的,如float x = 1.0;会出现编译错误,因为1.0默认是double类型,而将double类型赋值给float类型要使用强制类型转换,而整型数可以直接赋值给float类型,如float x=2;不会报错。长整数默认类型是整数,只要数据的大小没有超过给定的数据类型的表示范围,则可以自动转换。浮点数存在舍入误差,很多数据不能精确表示,如果需要进行不产生舍 入误差的精确数字计算,需要使用BigDecimal(大小数)类。最好避免在比较中使用浮点数。
1.2、数据类型之间的相互转换
1.2.1、自动类型转换
范围小的数据类型可以自动转换为范围大(这里所说的容量大小表示表示数据的范围,并不表示存储该类型的数据的字节数,如long类型数据可以自动转换为float类型,只不过可能会丢失精度)的数据类型,如 int i=3;double d = i;;特例:可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,只要不超出其表示的数据范围。如:short b = 12;//合法这里使用到的是后面将会提到的隐形强制类型转换 short b = ;//非法。
说明:图中黑线连接的表示无数据丢失的类型转换,红线表示在转换的时候可能会丢失精度。
Int类型可以自动转换为float类型但可能会损失精度,同理long类型也可以自动转换为float或double但可能会损失精度。
但要注意:对于像上面那样将表示范围小的数转换为表示范围大的数称为拓宽转换,拓宽转换中数字类型(数字类型是指这个数是一个数字,而不是一个字符)包括整数和浮点数类型都是彼此兼容的,但是数字类型和字符类型与布尔类型是不兼容的。字符型数据可以与数值型数据之间相互转换,尽管char不是整数,但在许多的情况中可以使用char型数据与整型数据进行运算,如char ch = ‘a’+32;
1.2.2、强制类型转换
强制类型转换又称为造型,将一个表示范围大的数转换为一个表示范围较小的数的时候要使用强制类型转换,但可能造成精度降低或溢出。当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。如:int x=300; byte b = (byte)x;//b的值为44。(但需注意:类型转换并不改变被转换的变量值与类型,而只是产生中间结果。如double d=4.5; int i = (int)d;其中d的值仍然为4.5没有改变。)
在Java中如果运算发生溢出,将出现一个无意义的数。如int money = ;int year = 20;long total = (long)money*year;注意在这里最后一句不可以写成long total = (long)(money*year);因为money和year都是整型在运算时结果还是整型而整型的存储范围有放不下这么大的数就会溢出使得money*year结果是一个负int整数,而将负int整数强制转换为长整型整数,该长整型整数还是负数,只有首先将money或year中的一个或两个提升到长整数,由于运算结果与运算中范围较大的数保持一致使得整个运算结果都是一个长整数。再如long times = 70L*70*24*365;如果没有加L运算结果将是一个负数,同时要注意L最好放在前面,因为如果放在后面,前面相乘的时候有可能已经发生溢出了,再乘还是溢出。
二进制数的表示:如3的二进制表示int a = (数字)0b00000000000000000000000000000011;
System.out.println(a)://3 ,在jdk7中新增加了一些特性:①下划线分隔符的使用可以在数之间任意位置添加任意多个下划线如int a =
0b0000_0000_00_00_0000_0000__0000_0000_0011;System.out.println(a);//3利用这个特性可以更加直观的写一些长的二进制数。该特性同样可以用在十进制数中如int y = 1243_13_423; System.out.println(y);//,同理在八进制16进制中都可以是使用。
在Java中boolean类型的数不能和其他数据类型互相转化,不能出现while(1)等情况,这一点与C\C++不同;另外还要注意,在Java中boolean类型占一位,而不是一个字节(8位)。
1.2.3、隐含强制类型转换
由于Java中没有专用后缀来表示byte,short类型的字面常量,所以Java系统允许在编写代码时用int类型的字面常量来表示byte,short类型的字面常量,由编译系统来自动识别。例如:byte c = 123;编译系统会自动将123变为byte类型,而不是int型。
但要注意,对变量则不行,例如:int i= 123; byte b = i; 此时会报错,正确做法byte b = (byte)
二、变量和常量
2.1、常量
常量:在程序运行过程中其值不能被改变的量被称为常量,在运行过程中其值可以被改变的量称为变量。常量必须在声明时赋值,常量一旦被赋值后,该常量值就不能够被更改。final是声明常量的Java关键字。例:final double PI = 3.;final double PI;PI = 3.14;是错误的。常量一般使用大写,常量的各个单词之间使用下划线隔开。
2.2、变量
变量:在Java中变量分为两种,一种是实例变量(成员变量),这样的变量是属于类的,如果不人工初始化,Java系统会自动为这些实例变量指定一个默认值(数值型变量初始值是0或0.0,字符型变量的初始值是16位的0,布尔型的默认值是false)。另一种是局部变量,这类变量在某个方法或语句块内部定义的变量,在使用前必须先声明和初始化(赋值)。
每一个变量都有它自己的作用域和生存周期。变量的作用域是变量在程序中可以使用的有效范围。变量的生存周期是指一个变量从创建(变量声明)并为它分配内存空间开始到这个变量被销毁并清除其所占的内存空间的过程,即变量占用内存的时间,变量声明格式:type varName [=value][{varName[=value]}];方括号中为可选。
注意变量声明其实就是为计算机中的某个内存单元取一个名字,然后便可以使用这个名字访问这个内存单元。变量声明(必须要的)。与C语言不同的是,Java中内部作用域声明的变量与其外部作用域声明的变量不能重名。如:classs ScopeErr{ public static void main(String args[]) { int bar = 1;{ int bar =2; //编译错误,bar已经被定义}}}
L原则:由于小写的l与数字1十分相似,因此在编程中尽量不使用小写的l(小写L),而在要使用L的地方(如表示长整型数或命名变量)使用大写L。
三、标识符命名规范
3.1、标识符
标识符就是表示程序中的事物(或对象)的名字,Java中的包,类,方法,参数和变量等的名字都是标识符。java语言规定标识符只能由字母(大小写),数字(0~9),下划线(_)和美元符号($)四种字符组成,且第一个字符不能是数字,同时由于Java中的字母采用的是Unicode字符集,因此这里所指的字母是指广义上的字母并不仅仅是指26个英文字母,同时包含汉字,日文等其他国家文字。另外,Java语言是大小写敏感的语言。
良好的编程习惯,在定义标识符是要尽量选择描述性的名字,做到“见名知意”,这样可以增强程序的可读性。
3.2、命名规范
Java中的命名规范:
(1)所有变量,方法,类名做到见名知意。
- 变量,方法名:首字母小写,新单词用大写(驼峰原则)如monthSalary。
- 常量:所有字母大写,新单词使用下划线隔开。MAX_VALUE
- 类名:首字母大写和(驼峰原则)。GoodMan
3.3、转义字符
转义字符 |
名称 |
Unicode |
输出结果 |
\b |
退格符 |
\u0008 |
将当前位置后退一个字符 |
\t |
Tab键 |
\u0009 |
将当前位置移动到下一个Tab位置 |
\n |
换行符号 |
\u000A |
将当前位置移动到下一行的开头 |
\f |
换页 |
\u000C |
将当前位置移动到下一页的开头 |
\\ |
反斜杠 |
\u005C |
输出此字符 |
\r |
回车键 |
\u000D |
将当前位置移动到本行的开头 |
\’ |
单引号 |
\u0027 |
输出此符号 |
\” |
双引号 |
\u0022 |
输出此符号 |
四、Java输入输出
数据的输入输出:在Java语言中,数据的输入和输出操作是通过流来完成的。(流是指数据在计算机各部件之间的流动,它包括输入流和输出流。)Java中流的实现是在java.io包中定义的。Java定义了一个名为System的类,该类包含3个预定义的流变量:in,out和err。
4.1、输入
Java中并不直接支持控制台输入,但可以使用Scanner类来创建它的对象以读取来自System.in的输入。语法:Scanner input = new Scanner(System.in);
Scanner对象的方法
方法 |
描述 |
nextByte() |
读取一个byte类型的整数 |
nextShort() |
读取一个short类型的整数 |
nextInt() |
读取一个int类型的整数 |
nextLong() |
读取一个long类型的整数 |
nextFloat() |
读取一个float类型的浮点数 |
nextDouble() |
读取一个double类型的浮点数 |
next() |
读取一个字符串,该字符串在一个空白符之前结束 |
nextLine() |
读取一行文本,一按下回车键为结束标志 |
字符型输入的一班形式:char c = (char )System.in.read();System.in.read()方法是键盘自负输入,他返回字符的ASCll码值,如果要得到字符数字(0,1,2,3,4,5,6,7,8,9)本身,可以将原返回的数字字符的ASCLL码值减去’0’或48;
4.2、输出
Java中使用System.out来表示标准输出设备。完成控制台的输出,只需使用print()方法和println()方法就可以在控制台上显示基本值或字符串。Print()方法和println()方法的区别在于:当显示完字符串之后,println()方法会将光标移动到下一行,而print()方法不会将光标移到下一行。另外,在println()方法中输出字符串可以通过“+”运算符进行连接。如System.out.println(“a=”+a+”b=”+b);
格式化输出:System.out.printf(“Hello ,%s.Next year ,you will be %d”,name,age);
常见的格式转换符:
格式转换符 |
输出 |
举例 |
%b |
布尔值 |
true或false |
%c |
字符 |
‘A’ |
%d |
十进制整数 |
167 |
%f |
浮点数 |
v |
%e |
标准科学计数法形式的数 |
1.34E+1 |
%s |
字符串 |
“Welcome to China” |
%x |
十六进制整数 |
3f |
%o |
八进制整数 |
77 |
%a |
十六进制浮点数 |
FF.35AE |
%% |
百分比类型 |
% |
%n |
换行符 |
注意:printf()方法中的格式转换符要与后面要输出的数据(条目)在类型,次序,数量必须完全匹配。比如:对应于格式转换符%f或%e的数据必须是浮点型值,如21.0,而不能使21。在格式化转换福中指定宽度和精度举例:
举例 |
输出 |
%5c |
指定字符的输出宽度为5,输出字符并在字符前面加4个空格 |
%6d |
输出整数,如果该数宽度小于6,左边加空格,宽度大于6,自动增加宽度 |
%12.3f |
输出浮点数宽度至少为10,包括小数点和小数点后4位。如果小数点前的整数部分小于5,在该书左边加空格,否则,自增加宽度 |
%6b |
指定布尔值的宽度为6,输出false前加一个空格,输出true前加两个空格 |
%-d |
左对齐,默认情况下输出是右对齐的 |
%+d |
为正数或负数添加符号 |
%0d |
数字前补0 |
%,f |
以“,”对数字分组 |
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48929.html