注释:就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须要的,它不影响程序的编译和运行。
Java中有单行注释、多行注释和文档注释
单行注释以//开头,以换行结束,格式如下:
//注释内容多行注释以/*开头,以*/结束,格式如下:
/*注释内容*/文档注释以/**开头,以*/结束,Java特有的注释,结合
/**注释内容*/代码语言:javascript复制//单行注释/*多行注释*//**文档注释演示@authorgaoziman*/publicclassComments{/**Java程序的入口@paramString[]argsmain方法的命令参数*/publicstaticvoidmain(String[]args){System.out.println("hello");}}常见的几个注释:
其中@param@return和@exception这三个标记都是只用于方法的。
使用javadoc工具可以基于文档注释生成API文档。
用法:javadoc[options][packagenames][sourcefiles][@files]例如:
即给类、变量、方法、包等命名的字符序列,称为标识符。
Java中合法的标识符需要满足以下要求:
标识符的命名规范(建议遵守的软性规则,否则容易被鄙视和淘汰)
例如,以下是合法的标识符:
而以下是不合法的标识符:
关键字:是指在程序中,Java已经定义好的单词,具有特殊含义。
Java关键字的种类有很多,包括基本数据类型关键字(如int、double、boolean等)、控制流程关键字(如if、for、while等)、访问权限关键字(如public、private、protected等)、类和对象关键字(如class、new、extends、super等)、异常处理关键字(如try、catch、finally等)等。不同的关键字有不同的作用和用法,程序员需要根据具体的需求选择合适的关键字来编写代码。
Java关键字的使用规则也有一些限制,例如关键字不能作为变量名、方法名等标识符的名称,也不能在不同的上下文中使用不同的含义。因此,在编写Java代码时,程序员需要遵守Java关键字的使用规则,以保证程序的正确性和可读性。
关键字一共50个,其中const和goto是保留字。
true,false,null看起来像关键字,但从技术角度,它们是特殊的布尔值和空值。
Java中,字面量指的是在程序中直接使用的数据,字面量是Java中最基本的表达式,不需要进行计算或转换,直接使用即可。
Java的数据类型分为两大类:
现阶段重点研究基本数据类型,以后再说引用数据类型。
下面详细介绍一下每种类型的特点和使用方法:
为什么设计出这么多整数?目的是合适的数据选择合适的类型,可以节省空间,但实际开发中不必斤斤计较,大部分采用int。另外,如果数据过大,超过了long,可以使用BigInteger,它就不是基本数据类型了,属于引用数据类型。后面再说。
这是一个直观的列表:
数据类型
占用字节数
取值范围
具体取值范围
默认值
byte
1
-2^7~2^7-1
-128~127
0
short
2
-2^15~2^15-1
-32768~32767
int
4
-2^31~2^31-1
-2147483648~2147483647
long
8
-2^63~2^63-1
-9223372036854775808~9223372036854775807
0L
float
1.4E-45~3.4028235E38
0.0f
double
4.9E-324~1.7976931348623157E308
0.0d
boolean
true/false
false
char
0~2^16-1
0~65535
‘\u0000’
publicclassDefaultValue{//成员变量有系统默认值staticinti;publicstaticvoidmain(String[]args){System.out.println(i);//0//成员变量没有系统默认值intk;System.out.println(k);//编译报错}}注意:对于引用数据类型来说,默认值null,例如:
Java中整数型字面量默认被当做int类型来处理,如果要表示long类型的整数,需要在字面量后面加上’L’或’l’标记。例如,下面是表示int和long类型整数的字面量的示例:
intx=10;//10是一个int类型的字面量longy=10L;//10L是一个long类型的字面量需要注意的是,大小写字母’L’和’l’的使用没有区别,但是容易被误解为数字1,因此建议使用大写字母。请看以下代码有什么问题吗?
longz=2147483648;编译报错,原因是2147483648被当做int类型处理,而该数字本身已经超出了int最大值,如何修改?
基本数据类型的转换规则如图所示:
在Java中,对于基本数据类型来说,小容量是可以直接赋值给大容量的,这被称为自动类型转换。对于数字类型来说大小关系为:byte 当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时。 inti=1;byteb=1;doubled=1.0;doublesum=i+b+d;//混合运算,升级为double(3)当byte,short,char数据类型进行算术运算时,按照int类型处理。 强制类型转换:Java中大容量是无法直接转换成小容量的。因为这种操作可能会导致精度损失,所以这种行为交给了程序员来决定,当然这种后果自然是程序员自己去承担。因此在代码中需要程序员自己亲手加上强制类型转换符,程序才能编译通过。以下程序编译器就会报错: intnum=10L;解决方案两个:要么把L去掉,要么使用强制类型转换符,例如: intnum=(int)10L;这样编译器就能编译通过了。 强制类型转换时,底层二进制是如何变化的?原则:砍掉左侧多余的二进制。例如以上程序的二进制变化是这样的:long类型的10对应的二进制:0000000000000000000000000000000000000000000000000000000000001010强制转换为int类型的10是这样的:00000000000000000000000000001010因此,强制类型转换时,精度可能会损失,也可能不会损失,这要看具体的数据是否真正的超出了强转后的类型的取值范围。如下图:水可能溢出,也可能不会溢出,这要看真实存放的水有多少!!! 如果你理解了强制类型转换,那么下面这个程序的执行结果可以推算出来吗? byteb=(byte)150;int类型的150的补码(150是正数:原码反码补码一样):00000000000000000000000010010110强转砍掉前三个多出的字节,结果是:10010110(这个是最终存储在计算机中的,注意:存储在计算机中的是补码)将以上补码10010110推算出原码:11101010(结果是:-106)因此int类型的150强转为byte类型之后,结果是-106 在Java中有这样一个规定,当整数型字面量没有超出byte的范围:可以直接赋值给byte类型的变量。 byteb=127;//这是允许的很显然,这是一种编译优化。同时也是为了方便程序员写代码。如果超出了范围,例如: byteb=128;//编译报错这样就会报错,需要做强制类型转换,例如: byteb=(byte)128;它的执行结果你知道吗?可以尝试推算一下,最终结果是:-128在整数类型中,除了byte有这个待遇之外,short同样也是支持的。也就是说:如果整数型字面量没有超出short取值范围时,也是支持直接赋值的。 两个int类型的数据做运算,最终的结果还是int类型: bytea=100;intb=200;longc=300L;longd=a+b+c;你可以测试一下,如果d变量是int类型则编译器会报错。 以下程序编译通过: bytex=10/3;为什么编译通过?这种情况下都是字面量的时候,编译器可以在编译阶段得出结果是3,而3没有超出byte取值范围。可以直接赋值。以下程序编译报错: inta=10;intb=3;bytex=(byte)(a/b);这里需要注意的是:注意小括号的添加,如果不添加小括号,例如: inta=10;intb=3;bytex=(byte)a/b;这样还是编译报错,因为只是将a强转为byte了,b还是int。byte和int混合运算,结果还是int类型。 浮点型类型包括: Java中,浮点型字面量默认被当做double类型,如果要当做float类型,需要在数字后面添加F或f。 floatf=3.0;//编译报错报错原因是:3.0默认被当做double类型,大容量无法直接赋值给小容量。如何修改: floatf=3.0F;另外,可以通过以下程序的输出结果看到,double精度高于float: doublex=1.23;doubley=0.23;doublez=.23;第二种形式:科学计数法 符号位:0表示整数。1表示负数。指数位:比如小数0.123E30,其中30就是指数。表示0.123*10的30次幂。所以也有把指数位叫做偏移量的。最大偏移量127。尾数位:浮点数的小数部分的有效数字。例如:0.00123,那么尾数位存储123对应的二进制。 从浮点型数据存储原理上可以看到,二进制中的指数位决定了数字呈指数级增大。因此float虽然是4个字节,但却可以表示比long更大的数值。因此float容量比long的容量大。 doublex=6.9;doubley=3.0;doublez=x/y;System.out.println(z);它的执行结果是:2.3000000000000003并不是2.3因此一旦有浮点型数据参与运算得出的结果,一定不要使用“==”与其它数字进行“相等比较”。例如,以下代码就存在问题: doublex=6.9;doubley=3.0;doublez=x/y;if(z==2.3){System.out.println("相等");}执行发现并没有输出:相等。原因是判断条件有问题。如果确实需要进行比较,可以将代码修改为如下: doublex=6.9;doubley=3.0;doublez=x/y;if(z-2.3<0.000001){System.out.println("相等");}也就是说,如果这两个数字之间的差小于0.000001,我就认为是相等的。因此:如果有浮点型数据参与运算得出了结果,不要拿着这个结果和另一个数据进行“==”相等比较。 char:字符型,占用2个字节。取值范围065535。和short(-3276832767)所表示的个数相同。但char可以表示更大的整数。字符型字面量采用单引号括起来,例如:‘a’、‘A’、‘0’、‘国’等。字符型字面量只能是单个字符,不能是多个字符。Java中char类型可以存储一个汉字。 Java中的转义字符是一些在字符串中具有特殊含义的字符序列,它们以反斜线(\)开始。以下是Java中的一些常用转义字符: 这些转义序列可以用于不同的Java数据类型,如字符串、字符等。在Java编程中,转义字符可以帮助我们在字符串中表示一些特殊的字符,例如制表符、换行符、引号等。例如,下面的代码演示了如何使用转义字符来创建包含制表符和换行符的字符串: Stringstr="Hello\tworld\nHowareyou";System.out.println(str);这个例子中,\t和\n分别表示字符串中的制表符和换行符。输出结果是: 十进制 字符 NUL 32 SPACE 64 @ 96 `| SOH 33 ! 65 A 97 a STX 34 " 66 B 98 b 3 ETX 35 # 67 C 99 c EOT 36 $ 68 D 100 d 5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL 39 ’ 71 G 103 g BS 40 ( 72 H 104 h 9 HT 41 ) 73 I 105 i 10 LF 42 * 74 J 106 j 11 VT 43 + 75 K 107 k 12 FF 44 , 76 L 108 l 13 CR 45 - 77 M 109 m 14 SO 46 . 78 N 110 n 15 SI 47 / 79 O 111 o 16 DLE 48 80 P 112 p 17 DC1 49 81 Q 113 q 18 DC2 50 82 R 114 r 19 DC3 51 83 S 115 s 20 DC4 52 84 T 116 t 21 NAK 53 85 U 117 u 22 SYN 54 86 V 118 v 23 ETB 55 87 W 119 w 24 CAN 56 88 X 120 x 25 EM 57 89 Y 121 y 26 SUB 58 : 90 Z 122 z 27 ESC 59 ; 91 [ 123 { 28 FS 60 < 92 |124 29 GS 61 = 93 ] 125 } 30 RS 62 > 94 ^ 126 ~ 31 US 63 95 _ 127 DEL 作为程序员,我们应当记住以下几个常用字符的ASCII码: 在计算机系统中,解码(Decoding)和编码(Encoding)是两个常用的概念,分别表示将二进制数据转换为字符和将字符转换为二进制数据。编码是将字符转换为二进制数据的过程。解码是将二进制数据转换为字符的过程。例如: 乱码是指在字符编码和解码的过程中,由于编码和解码所采用的字符集不一致,或者编码和解码所采用的字符集不支持某些字符,导致最终显示的字符与原始字符不一致。为了避免乱码的问题,我们需要统一使用一个字符集,并且在进行字符编码和解码时要保持一致。 常见的字符编码方式如下: 每种编码方式都有其特点和适用场景。在进行软件开发、网站开发和数据存储时,需要根据实际情况选择适合的编码方式。 注意:Java语言中的字符char和字符串String,都是采用Unicode编码。 Unicode码表示的一部分: 十六进制码 名称 符号 U+0020 空格 (space) U+0021 感叹号 (exclamationmark) U+0022 双引号 (quotationmark) U+0023 井号 (numbersign) U+0024 美元 (dollarsign) U+0025 百分号 (percentsign) U+0026 和号 (ampersand) U+0027 单引号 (apostrophe) U+0028 左括号 (leftparenthesis) U+0029 右括号 (rightparenthesis) U+002A 星号 (asterisk) U+002B 加号 (plussign) U+002C 逗号 (comma) U+002D 减号 (hyphen,-minussign) U+002E 句点 (fullstop,period) U+002F 斜杠 (slash,forwardslash) U+0030 零 (digitzero) U+0031 一 (digitone) U+0032 二 (digittwo) U+0033 三 (digitthree) U+0034 四 (digitfour) U+0035 五 (digitfive) U+0036 六 (digitsix) U+0037 七 (digitseven) U+0038 八 (digiteight) U+0039 九 (digitnine) U+003A 冒号 (colon) U+003B 分号 (semicolon) U+003C 小于号 (lessthansign) U+003D 等于号 (equalssign) U+003E 大于号 (greaterthansign) U+003F 问号 (questionmark) U+0040 艾特符号 (commercialat) U+0041 拉丁大写字母A (LatincapitalletterA) U+0042 拉丁大写字母B (LatincapitalletterB) U+0043 拉丁大写字母C (LatincapitalletterC) U+0044 拉丁大写字母D (LatincapitalletterD) U+0045 拉丁大写字母E (LatincapitalletterE) U+0046 拉丁大写字母F (LatincapitalletterF) U+0047 拉丁大写字母G (LatincapitalletterG) 在Java程序中也可以使用Unicode码来指定char变量的值: Java中允许将一个整数赋值给char类型变量,但这个整数会被当做ASCII码值来处理,例如: charc=97;System.out.println(c);会将97当做ASCII码值,该码值转换char类型是字符’a’,所以输出结果是:a但需要特别注意的是,这个码值有要求,不能超出char的取值范围。如果是这样的,编译会报错: //编译报错charc=65536;所以结合之间的byte和short,可以有这样一个结论(记住):只要没有超出byteshortchar的取值范围,是可以直接赋值给byteshortchar类型变量的。例如: byteb=1;shorts=1;charc=1;再看以下程序输出结果: byteb=1;shorts=1;charc=1;shortnum=b+s+c;编译报错:第4行的等号右边是int类型,int类型无法赋值给short类型的变量。这里有一个结论需要记住:byteshortchar混合运算时,各自会先转换成int再做运算。 Java中的布尔型,关键字:boolean只有两个值:true、false。没有1和0这一说。true表示真,false表示假。 Java中的布尔值(boolean)通常用于表示一些逻辑上的真假值,并在程序中进行逻辑控制。以下是布尔值在Java中常用的场景: 综上所述,Java中的布尔值在程序中有很多用途,可以在很多场景下提供非常便利的逻辑控制和判断能力。 下面是一个使用布尔值的简单案例: 有两个变量a和b,a变量中存储的数据100,b变量中存储的数据200,请编写程序交换两个变量中的数据。让a变量存储200,让b变量存储100。并且计算两个int类型数据的和,要求最终输出200+100=300的效果。 请分析以下程序中哪些是可以编译通过的,哪些是报错的 Stringname="jack";数据类型后面小节会详细讲解。目前只需要知道int代表整数类型,String代表字符串类型即可。另外,变量的“变”体现在哪里呢?体现在变量这个盒子中的数据是可以改变的。例如,通过“=”赋值运算符,可以改变盒子中存储的数据: age=30;这个操作用专业术语表达叫做:给变量重新赋值。重新赋值时也是有要求的,值的类型要和变量的类型一致,不然就会报错,例如: age="30";报错信息如下: 编译器找到等号右边的数据,发现是String类型,然后发现age这个盒子只能存储int类型,类型不匹配,表示这种int盒子不能存放String类型的数据。 有这样一个需求:请用你当前所学知识,分别计算100和111、222、666、888、999的和,你该怎么编写代码? System.out.println(100+111);System.out.println(100+222);System.out.println(100+666);System.out.println(100+888);System.out.println(100+999);现在需求变化了,要求计算234和111、222、666、888、999的和,你需要将以上代码中所有的100全部进行修改: System.out.println(234+111);System.out.println(234+222);System.out.println(234+666);System.out.println(234+888);System.out.println(234+999);修改了5个位置,如果求和的数据更多,那么修改的位置也会更多,显然:可维护性太差。怎么解决?使用变量可以解决。 intnum=100;System.out.println(num+111);System.out.println(num+222);System.out.println(num+666);System.out.println(num+888);System.out.println(num+999);如果需求变化了,只需要修改一个位置即可: 再比如,又有这样一个需求:现在有三个圆,半径分别是10cm,20cm,30cm,π取值3.14,请分别计算他们的面积,如果不使用变量,程序是这样的: System.out.println(3.14*10*10);//314System.out.println(3.14*20*20);//1256System.out.println(3.14*30*30);//2826上面程序存在的最大问题就是:可读性太差。使用变量可以提高程序的可读性: doubleπ=3.14;intr1=10;intr2=20;intr3=30;System.out.println(π*r1*r1);System.out.println(π*r2*r2);System.out.println(π*r3*r3);因此变量的出现可以提高程序的可读性。 给变量赋值,就是把“值”存到该变量代表的内存空间中。 1、变量赋值的语法格式 变量名=值;2、可以使用合适类型的常量值给变量赋值 3、可以使用其他变量或者表达式给变量赋值 2、变量名 3、值 2、在使用之前必须初始化 如果没有初始化,会报“未初始化”错误 3、变量有作用域 如果超过作用域,也会报“找不到符号”错误 4、在同一个作用域中不能重名 这样做的好处,就是可以见名知意,便于维护。 十进制的256,二进制:100000000,为了缩短二进制的表示,又要贴近二进制,在程序中引入八进制和十六进制 与二进制换算规则:每三位二进制是一位八进制值 与二进制换算规则:每四位二进制是一位十六进制值 二进制 八进制 十六进制 1000 1001 1010 a或A 1011 b或B 1100 c或C 1101 d或D 1110 e或E 1111 f或F 10000 要将一个十进制数转换为二进制数,可以使用以下步骤: 例如,将十进制数27转换为二进制数:27÷2=13…113÷2=6…16÷2=3…03÷2=1…11÷2=0…1所以27的二进制数为11011。 将二进制数每一位权值找出来,然后每个权值与对应二进制位相乘,最后将它们相加,即可得到十进制数。 什么是权值?在二进制中,权值指的是每个位所代表的数值大小,即二进制中每个位的位置所代表的数值大小。例如,在二进制数1101中,最高位的权值为8,次高位的权值为4,第三位的权值为2,最低位的权值为1。 例如,二进制数1101转换为十进制数的计算过程如下:1×23+1×22+0×21+1×2=8+4+0+1=13因此,二进制数1101转换为十进制数为13。 将以下十进制的数字转换为二进制: 将以下二进制的数字转换为十进制: 将十进制数除以8,直到商为0,然后将每次的余数从下往上排列即为该十进制数的八进制表示。例如,将十进制数27转换为八进制:27÷8=3…33÷8=0…3所以27的八进制表示为33。 八进制转换为十进制的方法如下: 例如,将八进制数346转换为十进制数:3×8^2+4×8^1+6×8^0=3×64+4×8+6×1=198因此,八进制数346转换为十进制数为198。 例如,将十进制数255转换为十六进制数: 将十六进制转换为十进制的方法是将每一位的十六进制数值乘以对应的权值,再将各位的结果相加。例如,将十六进制数ABCD转换为十进制数: 另一种简便的方法是,将十六进制数中的每一位转换为4位的二进制数,再将这些二进制数转换为十进制数,最后将各位的结果相加。 二进制转换为十六进制的方法如下: 二进制数 十六进制数 0000 0001 0010 0011 0100 0101 0110 0111 例如,将二进制数1101011010111011转换为十六进制数: 将每个十六进制数位转换为四位二进制数即可。例如:将十六进制数AF转换为二进制数。A对应的二进制数为1010,F对应的二进制数为1111,因此AF对应的二进制数为10101111 请分别用四种类型的进制来表示10,并输出它的结果:(了解) float:单精度浮点型,占内存:4个字节,精度:科学记数法的小数点后6~7位double:双精度浮点型,占内存:8个字节,精度:科学记数法的小数点后15~16位 true底层使用1表示。 false底层使用0表示。 原码、反码和补码都是计算机二进制的表示方式。在这三种编码方式中,原码是最简单的,也是最直接的表示方式;反码可以解决原码在计算过程中的问题;补码可以解决反码在计算过程中的问题。计算机在底层是采用补码形式表示数据的。在二进制当中,最高位表示符号位,0表示正数,1表示负数。 规定:正数的补码与反码、原码一样,称为三码合一;负数的补码与反码、原码不一样:负数的原码:把十进制转为二进制,然后最高位设置为1负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)负数的补码:反码+1例如:byte类型(1个字节,8位)25==>原码00011001==>反码00011001-->补码00011001-25==>原码10011001==>反码11100110==>补码1110011正数的原码反码补码正数的原码、反码和补码都是相同的。例如,一个十进制数+5的二进制原码为00000101,反码为00000101,补码为00000101。原码:将正数的二进制表示直接写下来,最高位为0。反码:正数的反码就是其原码本身。补码:正数的补码也就是其原码本身。127的原码反码补码127的原码为01111111,其反码和补码均与原码相同。负数的原码反码补码负数的原码运算规则:将绝对值转换为二进制后,最高位改为1。-5的原码:10000101-5的反码:11111010(原则是:以原码作为参考,符号位不变,其他位取反。)-5的补码:11111011(原则是:以反码作为参考,符号位不变,加1)-128的原码反码补码-128的原码为10000000,其反码为11111111,补码为10000000。注意,对于-128这个特殊的数,它的补码和原码相同。 下面是一个简单的数据演示:假设我们要计算-3+2的结果,使用原码进行计算:-3的原码为10000011,2的原码为00000010,进行加法运算得到的结果为10000101,转换成十进制为-5,这个结果是错误的。使用补码进行计算:-3的补码为11111101,2的补码为00000010,进行加法运算得到的结果为11111111,转换成十进制为-1,这个结果是正确的。 因为float、double底层也是二进制,先把小数转为二进制,然后把二进制表示为科学记数法,然后只保存: ①符号位②指数位(需要移位)③尾数位 在JVM内存中,一个字符占2个字节,Java使用Unicode字符集来表示每一个字符,即每一个字符对应一个唯一的Unicode编码值。char类型的数值参与算术运算或比较大小时,都是用编码值进行计算的。 Unicode编码值 ‘0’ ‘1’ ‘A’ ‘B’ ‘a’ ‘b’ ‘尚’ 23578 例如:’\u5c1a’代表’尚’ 在文件中保存或网络中传输时文本数据时,和环境编码有关。如果环境编码选择ISO8859-1(又名Latin),那么一个字符占一个字节;如果环境编码选择GBK,那么一个字符占1个或2个字节;如果环境编码选择UTF-8,那么一个字符占1-4个字节。(后面讲String类时再详细讲解) 在Java中,一共有38个运算符。 运算符的分类: 分类 运算符 算术运算符(7个) +、-、*、/、%、++、– 赋值运算符(12个) =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^=等 关系运算符(6个) >、>=、<、<=、==、!= 逻辑运算符(6个) &、|、^、!、&&、|| 条件运算符(2个) (条件表达式)结果1:结果2 位运算符(7个) &、|、^、~、<<、>>、>>> Lambda运算符(1个) ->(后面学) 一元运算符(单目运算符) 正号(+)、负号(-)、++、–、!、~ 二元运算符(双目运算符) 除了一元和三元运算符剩下的都是二元运算符 三元运算符(三目运算符) 算术运算符 符号解释 加法运算,字符串连接运算,正号 减法运算,负号 乘法运算 除法运算,整数/整数结果还是整数 求余运算,余数的符号只看被除数 ++、-- 自增自减运算 1、单独使用 publicclassOperatorDemo3{publicstaticvoidmain(String[]args){//定义一个int类型的变量ainta=3;//++a;a++;//无论是变量前++还是变量后++,结果都是4System.out.println(a);}}2、复合使用 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 <= 比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。 >= 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。 == 比较符号两边数据是否相等,相等结果是true。 != 不等于符号,如果符号两边的数据不相等,结果是true。 符号特点 与,且 有false则false | 或 有true则true 异或 相同为false,不同为true 非 非false则true,非true则false && 双与,短路与 左边为false,则右边就不看 || 双或,短路或 左边为true,则右边就不看 &&和&区别, 和 区别: 按位与,当两位相同时为1时才返回1 按位或,只要有一位为1即可返回1 按位非,将操作数的每个位(包括符号位)全部取反 按位异或。当两位相同时返回0,不同时返回1 << 左移运算符 >> 右移运算符 >>> 无符号右移运算符 如何区分&,|,^是逻辑运算符还是位运算符?如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。 运算规则:左移几位就相当于乘以2的几次方 **注意:**当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位 byte,short,char在计算时按照int类型处理 正数:和右移一样 负数:右边移出去几位,左边补几个0,结果变为正数 1&1结果为11&0结果为00&1结果为00&0结果为0 1|1结果为11|0结果为10|1结果为10&0结果为0 1^1结果为01^0结果为10^1结果为10^0结果为0 ~1就是0 将右边的常量值/变量值/表达式的值,赋值给左边的变量 += 将左边变量的值和右边的常量值/变量值/表达式的值进行相加,最后将结果赋值给左边的变量 -= 将左边变量的值和右边的常量值/变量值/表达式的值进行相减,最后将结果赋值给左边的变量 *= 将左边变量的值和右边的常量值/变量值/表达式的值进行相乘,最后将结果赋值给左边的变量 /= 将左边变量的值和右边的常量值/变量值/表达式的值进行相除,最后将结果赋值给左边的变量 %= 将左边变量的值和右边的常量值/变量值/表达式的值进行相模,最后将结果赋值给左边的变量 <<= 将左边变量的值左移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 >>= 将左边变量的值右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 >>>= 将左边变量的值无符号右移右边常量/变量值/表达式的值的相应位,最后将结果赋值给左边的变量 &= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位与,最后将结果赋值给左边的变量 |= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位或,最后将结果赋值给左边的变量 ^= 将左边变量的值和右边的常量值/变量值/表达式的值进行按位异或,最后将结果赋值给左边的变量 (1)表达式不要太复杂 (2)先算的使用() 口诀:单目运算排第一;乘除余二加减三;移位四,关系五;等和不等排第六;位与、异或和位或;短路与和短路或;依次从七到十一;条件排在第十二;赋值一定是最后;