目录
1、注释
在Java中,有3种标记注释的方式。最常用的方式是使用//,其注释内容从//开始到本行结尾。当需要长篇的注释时,既可以在每行的注释前面标记//,也可以使用/*和*/将一段比较长的注释括起来。最后,第三种注释可以用来自动地生成文档。这种注释以/**开始,以*/结束。
2、数据类型
Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型,其中有4种整形、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。
2.1、整型

在Java中,整数的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。
长整型数值有一个后缀L或l(如4000000000L)。十六进制数值有一个0x或0X(如0xCAFE)。八进制有一个前缀0,例如,010对应八进制的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。
从Java7开始,加上前缀0b或0B就可以写二进制数。例如,0b1001就是9。另外 , 同样是从 Java 7 开始,还可以为数字字面量加下划线 ,如用1 _ 000 _ 000 ( 或0b1111 _ 0100 _ 0010 _ 0100 _ 0000 )表示一百万。 这些下划线只是为了让人更易读 。 Java编译器会去除这些下划线。
注意,Java没有任何无符号(unsigned)形式的int、long、short或byte类型。
2.2、浮点类型

double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double类型。float类型的数值有一个后缀F或f(例如3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。当然,也可以在浮点数值后面添加后缀D或d(例如,3.14D)。
警告:浮点数值不适用于无法接受舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1)将打印出0.8999999999999999,而不是人们想象的0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十进制无法精确的表示分数1/3一样。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。
2.3、char类型

char 类型原本用于表示单个字符。不过 ,现在情况已经有所变化 。如今,有些 Unicode字符可以用一个 char值描述,另外一些 Unicode 字符则需要两个char 值。
警告:Unicode转义序列会在解析代码之前得到处理。例如,"\u0022+\u0022"并不是由引号(U+0022)包围加号构成的字符串。实际上,\u0022会在解析之前转换为",这会得到""+"",也就是一个空串。
2.4、Unicode和char类型
码点是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母A的码点。Unicode的码点可以分成17个代码级别。第一个代码级别称为基本的多语言级别。码点从U+0000到U+FFFF,其中包括经典的Unicode代码,其余的16个级别码点从U+10000到U+10FFFF,其中包括一些辅助字符。
UTF-16编码采用不同长度的编码表示所有Unicode码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元;而辅助字符采用一对连续的代码单元进行编码。
在Java中,char类型描述了UTF-16编码中的一个代码单元。
我们强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。
2.5、boolean类型
boolean(布尔)类型有两个值:false和true,用来判断逻辑条件。整型值和布尔值之间不能进行相互转换。
3、变量与常量
变量名必须是一个以字母开头并由字母或数字构成的序列。需要注意,与大多数程序设计语言相比,Java中“字母”和“数字”的范围更大。字母包括'A'~'Z'、'a'~'z'、'_'、'$'或在某种语言中表示字母的任何Unicode字符。
声明一个变量之后,必须用赋值语句对变量进行显示初始化。千万不要使用未初始化的变量。在Java中,变量的声明尽可能的靠近变量第一次使用的地方,这是一种良好的编写风格。
在Java中,利用关键字final指示常量。关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上。常量名使用全大写。在Java中,经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。
提示:尽管$是一个合法的Java字符,但不要在你自己的代码中使用这个字符。它只用在Java编译器或其他工具生成的名字中。
3.1、常量
在Java中,利用关键字final指示常量,关键字final表示这个变量是能被赋值一次。
4、运算符
在Java中,使用算术运算符+、-、*、/表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示。
需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
注释:
在默认情况下,现在虚拟机设计者允许对中间件计算结果采用扩展的精度。但是,对于使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。
4.1、数学函数与常量
在Math类中,包含了各种各样的数学函数。在编写不同类别的程序时,可能需要的函数也不同。
注释:
在Math类,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。
如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类。
Math类提供了一些方法是整数有更好的运算安全性。如果一个计算溢出,数学运算符指示悄悄的的返回错误的结果而不做任何提醒。如Math.multiplyExact(100000000,3),就会生成一个异常。
4.2、数值类型之间的转换
经常需要将一种数值类型转换为另一种数值类型。图3-1给出了数值类型之间的合法转换。在图3-1中有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度损失的转换。


4.3、强制类型转换
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。
如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要使用Math.round方法。
警告:如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。
4.4、结合赋值和运算符
可以在赋值中使用二元运算符。
注释:如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。
4.5、自增和自减运算符
前缀形式会先完成加1,而后缀形式会使用变量原来的值。
4.6、关系和boolean运算符
Java包含丰富的关系运算符。要检测相等性,可以使用两个等号==。另外可以使用!=检测不相等。最后,还有经常使用的<(小于)、>(大于)、<=(小于等于)和>=(大于等于)运算符。
Java沿用了C++的做法,使用&&表示逻辑“与”运算符,使用||表示逻辑“或”运算符。&&和||运算符是按照“短路”方式来求职的:如果第一个操作数已经能够确定表达式的值,第二个操纵数就不必计算了。
4.7、位运算符
处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码技术得到整数的各个位。位运算符包括:&("and")|("or")^("xor")~("not")
- << 表示左移,不分正负数,低位补0,相当于num乘以2
- >> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1,相当于num除以2
- >>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
& 和 |运算符不采用“短路”方式来求值,也就是说,得到计算结果之前两个操作数都需要计算。
警告:移位运算符的右操作数要完成模32的运算(除非左操作数是long类型,在这种情况下需要对右操作数模64)。例如,1<<35的值等同于1<<3或8。
4.8、括号与运算符级别
表3-4给出了运算符的优先级。如果不使用圆括号,就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除了表中给出的右结合运算符外。)例如,由于&&的优先级比||的优先级高,所以表达式
a && b || c 等价于(a && b)|| c 又因为+=是右结合运算符,所以表达式a += b += c 等价于 a += (b += c)也就是将b += c的结果(加上c之后的b)加到a上。


4.9、枚举类型
有时候,变量的取值只在一个有限的集合内。针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如,
enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE};
现在,可以声明这种类型的变量:
Size s = Size.MEDIM;
Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。
4.10、字符串
从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然的叫做String。每个用双引号括起来的字符串都是String类的一个实例。
- 拼接
- 与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。当一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。
- 不可变字符串
- String类没有提供用于修改字符串的方法。由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串。不可变字符串有一个优点:编译器可以让字符串共享。
- 空串和Null串
- 空串""是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:if(str.length()==0)或if(str.equals(""))。空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联。要检查一个字符串是否为null,要使用以下条件:if(str == null)。
- 构建字符串
- 在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑,则应该使用StringBuilder替代它。这两个类的API是相同的。
- 检测字符串是否相等
- 只有字符串字面量是共享的,而 + 或 substring 等 操作得到的字符串并不共享。
4.11、输入输出
- 读取输入
- 要通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。Scanner in = new Scanner(System.in)。
- 格式化输出
每个以%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型:f表示浮点数,s表示字符串,d表示十进制整数。表3-5列出了所有的转换符。




4.12、文件输入输出
- 要想读取一个文件,需要构造一个Scanner对象。
Scanner in = new Scanner(Path.of("myfile.txt"),StandardCharsets.UTF_8);
- 要想写入文件,就需要构造一个PrintWriter对象。在构造器中 ,需要提供文件名和字符编码、
PrintWriter out = new PrintWriter("myfile.txt",StandardCharsets.UTF_8)
注意:
当指定一个相对文件名时,例如,“myfile.txt”,“mydirectory/myfile.txt”或“../myfile.txt”,文件位于Java虚拟启动路径的相对位置。如果在命令行方式下用下列命令启动程序:
java MyProg
启动路径就是命令解释器当前的路径。然而,如果使用集成开发环境,那么启动路径将由IDE控制。可以使用下面的调用方式找到路径的位置:
String dir = System.getProperty("user.dir")
本文全面介绍了Java编程的基础知识,包括注释、数据类型、变量与常量、运算符、字符串处理及输入输出等内容,适合初学者入门。

5284

被折叠的 条评论
为什么被折叠?



