第3章 Java笔记 数据类型和运算符

一、文档注释

如果Java源代码中添加了合适的文档注释,可以通过JDK提供的javadoc工具直接将源代码里面的文档注释提取为一份系统的API文档。

文档注释以斜线后紧跟两个星号(/**)开始,以星号后紧跟一个斜线(*/)结束,中间部分全部都是文档注释,会被提取到API中。由于API文档主要用于说明类、方法、成员变量的功能。因此javadoc工具只处理文档源文件在类、接口、方法、成员变量、构造器和内部类之前的注释,忽略其他地方的文档注释。而且javadoc工具默认只处理以public或者protected修饰的类、接口、方法、成员变量、构造器和内部类之前的文档注释。

javadoc命令的基本用法为:javadoc 选项 Java源文件|包

package lee;
/**
*Description:
*
Copyright (c),2015-2017,Yeeku.Java *
This program is protected by copyright laws. *
Program Name: *
Date: *@author Yeeke.Java *@version 1.0 */ public class JavadocTest { /** *简单测试成员变量 */ protected String name; /** *主方法,程序的入口 */ public static void main(String[] args) { System.out.println("Hello World!"); } }
在命令行执行如下命令即可生成API文档:

javadoc -d apidoc -windowtitle 测试 -doctitle 学习 javadoc 工具的测试API文档 -header 我的类 *Test.java
由上命令可以看出,Java源文件可以支持通配符,例如使用*.java代表当前路径下所有的Java源文件。命令中各个参数解释为:-d用于指定一个目录,将生成的API文档放到指定的目录下;-windowtitle 用于设置API文档的浏览器窗口标题;-doctitle 用于指定概述页面的标题;-header 指定每个页面的页眉;@author 用于指定Java程序的作者;@version用于指定源文件的版本。 注意:javadoc工具默认不会提取@author和@version两个标记的信息,如果需要提取这两个标记的信息,应该在使用javadoc工具时指定-author和-version这两个选项。上述命令执行效果如图:

第3章 Java笔记 数据类型和运算符_第1张图片


二、标识符规则

标识符是用于给程序中变量、类、方法命名的符号,使用标识符时应注意如下规则:

1、标识符可以由字母、数字、下划线(_)和美元符($)组成,其中数字不能打头。此处的字母不仅仅局限于26个英文字母,而且可以包括中文字符、日本字符等。

2、标识符不能是java关键字和保留字,但是可以包含关键字和保留字。

3、标识符不能包含空格。

4、标识符只能包含美元符($),不能包含@、#等其他特殊字符。
三、数据类型分类

1、java语言支持的类型分为两类:基本类型和引用类型。

基本类型包括boolean类型和数值类型。数值类型有整数类型和浮点类型。char代表字符型,实际上也是一种整数类型,相当于无符号整数类型。

引用类型包括类、接口和数组类型,还有一种特殊的null类型。空引用(null)是null类型变量唯一的值。空引用(null)可以转换为任何引用类型,不能转换成基本类型。

第3章 Java笔记 数据类型和运算符_第2张图片

2、int是最常用的整数类型,在通常情况下直接给出一个整数值默认是int类型。此外,如果直接将一个较小的整数值(在byte或short类型的表数范围内)赋给一个byte或short变量,系统会自动把这个整数值当作byte或者short类型来处理。如果使用一个巨大的整数值(超出int类型的表数范围)时,java不会自动把这个整数值当作long类型处理,应该在该大整数后面加上L。

3、二进制转换十进制的过程

原码是直接将一个数值换算成二进制数,而计算机以补码的形式保存整数,补码的计算规则:正数的补码和原码完全相同,负数的补码是其反码加1;反码是对原码按位取反,只是最高位(符号位)保持不变。

public class IntegerValTest 
{
	public static void main(String[] args) 
	{
		//定义两个8位的二进制整数
		int binVa11=0b11010100;
		byte binVal2 = 0B01101001;
		//定义一个32位的二进制整数,最高位是符号位
		int binVal3 = 0B10000000000000000000000000000011;
		System.out.println(binVa11);//输出212
		System.out.println(binVal2);//输出105
		System.out.println(binVal3);//输出-2147483645


	}
}
int类型在内存占32位,上述定义的32位int二进制,最高位(第32位)为符号位,符号位为1表示负数,符号位为0表示正数。如果将上述程序中的binVa13定义为long型,则该二进制数为正数,因为long占有64位,最高位也就是第64位为符号位。

将上面程序二进制binVa13转换成十进制数的过程如图:

第3章 Java笔记 数据类型和运算符_第3张图片

4、字符型通常用于表示单个字符,必须用单引号(‘)括起来。char类型(字符型)的变量、值完全可以参与加减乘除的运算,也可以比较大小,因为都是用该字符对应的编码进行运算。

5、java语言浮点类型的默认值为double类型,如果希望一个浮点类型被当作float类型处理,应该在这个浮点数后面紧跟f或者F。

java中POSITIVE_INFINITY表示正无穷大;NEGATIVE_INFINITY表示负无穷大;NaN表示非数(0.0/0.0或者对一个负数开方会得到一个非数)。注意:只有在浮点数除以0的时候才能得到正无穷大或者负无穷大,因为java会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整数除以0则会得到一个异常:ArithmeticException:/by zero(除0异常)。需要说明的是,所有的正无穷大数值都是相等的,所有的负无穷大数值也都是相等的;然而NaN不与任何数值相等,包括与NaN相比较也是不等的。
6、对于位数比较多的数值可以利用下划线进行分割:

public class UnderscoreTest 
{
	public static void main(String[] args) 
	{
		int binVal=0b1000_0000_0000_0000_0000_0000_0000_0011;
		double pi=3.14_15_92_6;
		System.out.println(binVal);
		System.out.println(pi);
		double height=8_9_4_8.23_23;
		System.out.println(height);
	}
}
7、在java中boolean类型的数值只能是true和false,不能用0或者非0来代表。字符串“true”和“false”不会直接转换成boolean类型,但是如果使用一个boolean类型的值加上一个字符串,则boolean类型的值将自动转换成字符串。

		//使用boolean类型的值和字符串进行连接运算,boolean类型的值会自动转换成字符串
		String str=true+"";
四、基本类型的类型转换

java有两种类型转换方式:自动类型转换和强制类型转换。当把一个表数范围小的数值或者变量直接赋给另一个表数范围大的变量时,系统将进行自动类型转换;否则需要强制转换。此外,当把任何一个基本类型的值和字符串进行连接运算时(+),基本类型的值将自动转化成字符串类型。

1、自动类型转换

自动类型转换图如下:

第3章 Java笔记 数据类型和运算符_第4张图片


2、强制类型转换

强制类型转换的语法格式:(targetType)value,强制转换的运算符为圆括号(())。

public class NarrowConversion 
{
	public static void main(String[] args) 
	{
		int iValue=233;
		//将int类型强转byte类型
		byte bValue=(byte)iValue;
		System.out.println(bValue);//输出-23
		double dValue=3.98;
		//将double类型强转为int类型
		int to1=(int)dValue;
		System.out.println(to1);//输出为3
	}
}
由上述程序可知将浮点数强制转换成整数时,Java直接把小数部分给截掉。对于上述的int强转为byte则是典型的溢出现象,该转换过程如下:

第3章 Java笔记 数据类型和运算符_第5张图片

32位的int类型转换成8位的byte类型,需要截断前面的24位,只保留右边的8位,最左边1为符号位,表示负数,负数在计算机里面是以补码形式的存在的,还需要换成原码。
3、表达式类型的自动提升

自动提升规则如下:

(1)所有的byte、short、char类型将被提升到int类型。比如y,z分别是byte和short类型。y与z进行运算则会自动提升到int类型。

byte y=3;
short z=4;
int s=y+z;//y+z已经是int类型了,必须用int类型的s去接收
System.out.println(s);

(2)整个表达式中的数据类型自动提升到与表达式中最高级操作数同样的类型。

a和b作某种运算
a和b中有double,结果就是double
a和b中有float,结果就是float
a和b中有long,结果就是long
五、运算符

1、求余运算符:%

public class ModTest 
{
	public static void main(String[] args) 
	{
		double a=5.2;
		double b=3.1;
		double mod=a%b;
		System.out.println(mod);//mod值为2.1
		System.out.println("5对0.0求余的结果是: "+5%0.0);//输出非数:NaN
		System.out.println("-5.0对0求余数的结果是: "+-5.0%0);//输出:NaN
		System.out.println("0对5.0求余数的结果是: "+0%5.0);//输出:0.0
		System.out.println("0对0.0求余数的结果是: "+0%0.0);//输出:NaN
		System.out.println("-5对0求余数的结果是: "+-5%0);//除数为0异常
	}
}
求余运算符是使用第一个操作数除以第二个操作数得到一个整除的结果后剩下的值就是余数。如果两个操作数都为整数类型,则第二个操作数不能为0,否则除数为0异常。如果两个操作数有一个或者两个都是浮点数,则允许第二个操作数为0或者0.0,只是结果为非数:NaN。0.或者0.0对零以外的任何数求余都是0或者0.0。

2、位云算符

java支持的位运算符有7个:

&:按位与。当两位同时为1时才返回1.

|:按位或。只要有一位为1即可返回1.

~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。

^:按位异或。当两位相同时返回0,不同时返回1。

<<:左移运算符。

>>:右移运算符。

>>>:无符号右移运算符。

public class BitTest 
{
	public static void main(String[] args) 
	{
		System.out.println(5 & 9);//输出1
		System.out.println(5 | 9);//输出13
		System.out.println(~-5);//输出4
		System.out.println(5 ^ 9);//输出12
		System.out.println(5 << 2);//输出20
		System.out.println(-5 << 2);//输出-20
		System.out.println(-5 >> 2);//输出-2
		System.out.println(-5 >>> 2);//输出1073741822
	}
}
执行5&9与5|9的运算原理(5的二进制为:00000101,9的二进制为:00001001):

第3章 Java笔记 数据类型和运算符_第6张图片

执行~-5的运算原理:

第3章 Java笔记 数据类型和运算符_第7张图片

执行5^9的原理:
第3章 Java笔记 数据类型和运算符_第8张图片
左移运算符是将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充。-5的左移运算过程如下:

>>运算符是把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位填充,即如果第一个操作数原来是正数,则左边补0;如果为负数,则左边补1。>>>是无符号右移运算符,它的第一个操作数的二进制码右移指定位数后,左边空出来的位全部以0填充。
-5>>2的运算过程:

-5>>>2的运算过程:

(图中以0填充的位置为0不是1),可以看到在进行无符号右移运算后的结果都是正数。
进行移位运算时应该遵循的规则:
(1)对于低于int类型的操作数总是先自动类型转换为int类型后再移位。
(2)对于int类型的整数移位a>>b,当b大于32时,系统先用b对32取余。得到的余数才是真正移动的位数。
(3)对于long类型的整数移位a>>b,当b>64时,总是先用b对64取余,得到的结果为移动的位数。
注意:当进行移位运算时,只要被移动的二进制码没有发生有效位的数字丢失(对于正数来说,通常是指被移出的位全部都是0),不难发现左移n位就相当于乘以2的n次方,右移n位则是除以2的n次方。不仅如此,进行移位运算不会改变操作数本身,只是得到一个新的运算结果,而原来的操作数本身是不会改变的。

你可能感兴趣的:(java自学知识点总结)