Java语言基础组成
一、关键字
1)定义:被Java语言赋予了特殊含义的单词
2)特点:关键字中所有字母均为小写
3)作用及分类:
下面是Java语言保留专用的50个关键字:
用于定义数据类型的关键字(12个):
-
class:用于定义类
-
interface:用于定义接口
-
byte:用于定义字节型基本数据类型
-
short:用于定义短整型基本数据类型
-
int:用于定义整型基本数据类型
-
long:用于定义长整型基本数据类型
-
float:用于定义单精度浮点型基本数据类型
-
double:用于定义双精度浮点型基本数据类型
-
char:用于定义字符型基本数据类型
-
boolean:用于定义布尔型基本数据类型
-
enum(JDK1.5新增):用于定义枚举类型
-
void:用于定义空返回值类型
用于定义流程控制的关键字(11个):if、else、switch、case、default、while、do、for、break、continue、return
用于定义访问权限修饰符的关键字(3个):private、protected、public
用于定义类,函数,变量修饰符的关键字(4个):abstract、final、static、synchronized
用于定义类与类之间关系的关键字(2个):extends、implements
用于定义建立实例及引用实例,判断实例的关键字(4个):new、this、super、instanceof
用于异常处理的关键字(5个):try、catch、finally、throw、throws
用于包的关键字(2个):package、import
其他修饰符关键字(5个):native、strictfp、transient、volatile、assert(JDK1.4新增)
不能使用的关键字(2个):goto和const是C++保留的关键字,目前在Java中不能使用。如果它们出现在Java程序中,Java编译器能够识别它们,并产生错误信息。
注意:
main不是关键字,但它能被java虚拟机所识别(初学者易犯的错误)。
字面常量true、false、null如同字面值100一样,它们不是关键字,但它们也不能用作标识符,就如同100不能用作标识符一样。
二、标识符
1)定义:在程序中自定义的一些名称。
2)命名规则:
- 由26个英文字母大小写,数字:0-9,符号:_ $ 组成。
-
定义合法标识符规则:
1,数字不可以开头。
2,不能是关键字。
3,不能是true、false或null。
- Java中严格区分大小写。
注意:
1)在起名字的时候,为了提高阅读性,要尽量有意义。
2)不要用字符$命名标示符,习惯上字符$只在机械地产生源代码时使用。
3)Java中的名称规范:
- 包名:多单词组成时所有字母都小写。
xxxyyyzzz
- 类名接口名:多单词组成时,所有单词的首字母大写。
XxxYyyZzz
- 变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。
xxxYyyZzz
- 常量名:所有字母都大写。多单词时每个单词用下划线连接。
XXX_YYY_ZZZ
三、注释
1)定义:用于注解说明程序的文字。
2)优点:提高了代码的阅读性。
3)Java中的注释格式:
- 单行注释(代码中某几句关键或难懂的程序加单行注释)
- 多行注释(类修饰符有改变时可能会加多行注释)
- 文档注释(类和函数上加文档注释)(java特有的注释)
格式:/** 注释文字 */
注:单行注释中可以有单行注释,也可以出现在文档注释和多行注释中,但多行注释和文档注释既不可以自行嵌套,也不可以相互嵌套。
4)注释的作用
-
单、多行注释:1,注解说明程序 2,用于调试程序
- 文档注释:对程序说明,可通过javadoc.exe工具将程序中的文档注释都提取出来形成网页,这个网页就是所写程序的说明书,供程序开发者使用。
注:“程序说明书”是提供给开发者使用的,“软件使用说明书”是提供给客户使用的,注意区分。
5)不同注释间的区别:
- 注释与单行多行注释的区别:对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
-
对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
6)养成好的编程习惯:
注释是一个程序员必须要具有的良好编程习惯。初学者编写程序可以养成习惯:先写注释再写代码。
代码是思想的一种体现形式而已。在以后的编程中养成将自己的思想通过注释先整理出来,再用代码去体现的习惯。
四、常量
1)定义:常量表示不能改变的数值。
2)Java中常量的分类:(常量也叫直接量)
-
整型常量(默认为int型):所有整数(其中长整型常量为:整数后加大写或小写的L)
-
浮点型常量(默认为double型):所有小数(其中单精度浮点型常量为:小数后加大写或小写的F)(双精度浮点型常量为:小数后加大写或小写的D)
-
布尔型常量:较为特有,只有两个数值,true和false。
-
字符型常量:将一个数字、字母或者符号用单引号(‘‘)标识,单引号中符号不能为空(空格也算字符,所以‘ ‘是可以的)。
-
字符串型常量:将0个、一个或者多个字符用双引号("")标识,双引号中符号可以为空。
-
null常量:只有一个值,null。
3)对于整数:java有四种表现形式。
-
十进制:0-9 ,满10进1,没有前缀。
-
二进制:0-1,满2进1,用0b("零b"或"零B"而非"ob",编程易写错)开头表示(这是1.7的新特性)。
-
八进制:0-7 ,满8进1, 用0("零"而非"o",编程易写错)开头表示。
- 十六进制:0-9,A-F,满16进1, 用0x("零x"或"零X"而非"ox",编程易写错)开头表示。
在计算机原理中(不要同java中的表示混淆):
-
八进制的数是这种表示:(386)Q
-
十六进制数是这种表示:(6C89)H
-
二进进制的是这种表示:(1101001)B
-
十进制是:(6438)D,D可以省略的
4)计算机中数据的存储:
计算机中的数据都是以二进制的形式进行存储的,字节是计算机中的最小存储单位。
常见的存储单位及换算:
1位=1bit(比特),1byte(字节)=8bits,1M=,1G=,1T=
注意:“bit”的中文翻译为“比特”,“byte”的中文翻译为“字节”,初学者易混淆。
5)编码表:
-
编码表的由来:为了让计算机识别人类的语言,将不同的字符用对应的二进制数进行表示,这样就形成了编码表。
-
常见编码表间的区别:
6)进制的出现及转换:
- 进制的由来:用0、1表示电信号形成了二进制;如果数据过大,用二进制表示数据时数据就会很长,为了避免这种麻烦,把数据缩短一点,将二进制用三位表示成一位,形成了八进制;还是过长,于是出现了用四位表示一位,形成了十六进制(java中的地址值就是用十六进制表示的)。
-
进制的转换:
a、十进制——>R进制(基数R=2、8、16):除基数取余,直到商为0,最后将余数反转(倒序取余法)
b、R进制——>十进制(基数R=2、8、16):数据每一位上的系数乘以对应基数的次幂(低位从零开始),然后求和即可
其中:二进制到十进制的技巧(查8421码)
c、二进制——>R进制(基数R=8、16):R=2m可以用m个二进制数表示出来(例如3个二进制位可以表示0~7的范围,一 个八进制位)
R=8:把二进制数据每三位组合,左边不够三位用0补位,然后把每个组合计算成对应的十进制数据,最后从左到右把数据相连即可
R=16:把二进制数据每四位组合,左边不够四位用0补位,然后把每个组合计算成对应的十进制数据,最后从左到右把数据相连即可
d、R进制——>二进制(基数R=8、16):
R=8:把每一个八进制数转换成三位二进制数,不够三位的用0补,最后从左到右把数据相连即可
R=16:把每一个十六进制数转换成四位二进制数,不够四位的用0补,最后从左到右把数据相连即可
-
负数的二进制表现形式:对应正数二进制(32位)取反+1(取反:将二进制的1变成0,0变成1)。
-
负数的二进制最高位都是1,正数二进制最高位都是0
五、变量
1)变量的概念:(相当于数学中的未知数)
- 内存中的一个存储区域
- 该区域有自己的名称(变量名)和类型(数据类型)
- 该区域的数据可以在同一类型范围内不断变化
2)变量的作用及好处:用来不断的存放同一类型的常量,可以重复使用。
3)使用时需要注意的事:
-
变量的作用范围(在声明所在的一对{}内有效)
-
使用前是否需要初始化
4)定义变量的基本格式:数据类型 变量名 = 初始化值;
5)使用方式
-
第一种,在声明的时候,就初始化值
数据类型 变量名 = 初始化值;
例如:byte b = 100;
-
第二种在使用前赋值:
声明
赋值
使用
-
如果几个变量为同一类型,那么可以一起声明,变量之间用逗号隔开
例如:int i,j = 3,k;
六、数据类型
Java语言是强类型语言(好处:节约空间),对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
1)java语言分为两种数据类型
A:基本数据类型
B:引用数据类型(类,接口,数组)
2)基本数据类型
A:区别:在内存中分配的空间大小不同,从而导致它们表示的数据范围不同
B:4类8种
-
整数型
-
byte——占1个字节,范围-27~27-1(-128~127)
-
short——占2个字节,范围-215~215-1(-32768~32767)
-
int——占4个字节,范围-231~231-1
-
long——占8个字节,其后加L或l(最好用大写的,小写与数字"1"容易分不清)标识,范围-263~263-1
-
浮点型
- float——占4个字节 其后必须加F或f标识
注意:float型所占存储空间虽然比long型小,但存储的数值范围比long大,这跟float在内存中的存储方式有关
32个二进制位,其中:1位符号位,8位指数位,23位尾数位
- double——占8个字节
-
字符型
char——占2个字节,范围0~65535(此范围是字符所对应码表的范围)
-
布尔型
boolean——占几个字节不确定:这个数据类型代表一个比特的信息,但它的“大小”不是精确定义的东西。
只有两个值:true,false
C:默认情况下:
整数是int类型
浮点数是double类型
3)数据类型转换
A:不同类型数据进行混合运算时要进行类型转换,类型转换有以下两种:
自动类型转换(也叫隐式类型转换)
强制类型转换(也叫显式类型转换)
B:整型,字符型,浮点型的数据在进行混合运算时会自动转换运算对象的类型,转换时遵循以下原则:
容量小的类型与容量大的类型进行计算,默认转换为容量大的数据类型(容量是指容纳数据的范围而非存储空间);
数据类型按容量大小排序为:
byte,short,char->int->long->float->double
当两个类型不同的运算对象进行二元运算时,表达式数据类型自动提升的具体规则如下 :
?如果一个操作数是double型,就将另一个转换为double型。
?否则,如果一个操作数是float型,就将另一个转换为float型;
?否则,如果一个操作数是long型,就将另一个转换为long型;
?否则,两个运算对象都转换为int型;这也就意味着所有的byte型、short型和char的值将被自动提升到int型(这个是即使只有自身数据类型参与运算时也执行的)。
注意:
byte、short、char之间不能进行自动类型转换,他们三者在计算时首先会转换为int类型;
其中,byte可以直接赋值给short(因为byte的范围在short范围内),但byte a = 55,b = 18;short s = a+b;这种操作是错误的。
什么时候要用强制类型转换:
有多种类型的数据混合运算时,系统首先自动的将容量小的数据转换成容量大的那一种数据类型,然后再进行计算。
而容量大的数据类型转换为容量小的数据类型时,需要进行强制类型转换,但可能造成精度降低或溢出,使用时要格外注意。
C:强制转换符
格式:(数据类型)要被转换的数据
例如:byte b = (byte)130;
D:字符型参与运算
首先会去找对应字符的unicode码值,然后运算。
能不能把整数直接赋值给char类型的变量?
可以,只要这个整数在char类型对应的码表取值范围内,char 类型取值范围0~216-1(0~65535)。
E:布尔型参与运算:不影响参与运算的其他数据的类型,常见于三元运算符中。
F:字符串参与运算
字符串会和参与运算的数据相连接组成一个新的字符串。
这个时候,"+"是作为连接符使用的,Java中经常会使用这个特性。
G:Java的常量优化机制
思考:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句会编译失败呢?为什么呢?
答:b=b1+b2;会编译失败,原因如下:
(1)byte,short,char三种数据类型在内存中运算的时候会自动类型提升为int去运算
(2)b1和b2是两个变量值,jvm无法判断里面值的大小
b=3+4;为什么能编译通过呢?
答:Java的常量优化机制,在编译的时候,会判断这个常量值或常量的和是否在变量数据类型的取值范围内,在,就会自动转换成变量数据类型进行赋值(包括char类型,如:char d = 5;),就可以编译通过,否则,编译失败。
七、运算符
1、算术运算符
符号:+、—、*、/、%、++、--
A:+
?作为数据的符号(正号)
?做加法运算(加号)
?字符串连接符
B:—
?作为数据的符号(负号)
?做减法运算(减号)
C:*
?做乘法运算(乘号)
D:/
?做除法运算(除号)
注意:如果除号两边都是整数,则结果也是整数,和日常生活的计算有所不同,计算机中除法计算得出的是近似值。
E:%
?求余运算(取模):得出除法的余数,左边是被除数,右边是除数
?运算结果取决于左边的数的符号与右边无关:左边为正,结果为正;左边为负,结果为负。
?作用:偶数%2总是0,奇数%2总是1,所以,能利用这一属性来判断一个数是奇数还是偶数。判断星期中的那一天,时分秒之间的转化等。
F:++,--
?递增++:就是加1;递减--就是减1
?单独存在,放在操作数的前面或者后面,结果一样
?参与运算时:
放在操作数的前面,先自身加1或者减1,然后再参与运算
如:j = ++ i;(假设i,j均为int型)
相当于:
i = i + 1; //i自身先加1
j = i; //然后参与运算
放在操作数的后面,先参与运算,然后再自身加或者减1
如:j = i ++;(假设i,j均为int型)
相当于:
int temp = i; //用temp记录住i最初的值
i = i + 1; //i自身加1
j = temp; //参与计算的是i自增前的值
典型例题:
1 class ZiZeng { 2 public static void main(String[] args) { 3 int i = 0; 4 for(int j = 0;j < 10;j++) 5 i = i++; 6 System.out.println(i); 7 } 8 } 9 10 /* 11 程序的打印结果为0 12 13 原因: 14 i = i++; 15 相当于: 16 int temp = i; 17 i = i + 1; 18 i = temp; 19 */
2、赋值运算符
符号:=、+=、—=、*=、/=、%=
A:=(赋值)
作用:将符号右边的数值赋给左边。
注意:是赋值不是等号,Java中等号用==表示。
B:简捷赋值运算符:+=、—=、*=、/=、%=
?+=(加等):把左边和右边的和赋给左边
举例:x+=2;等同于 x = x + 2;
?其它几个类似:
—=(减等):把左边和右边的差赋给左边
*=(乘等):把左边和右边的积赋给左边
/=(除等):把左边和右边的商赋给左边
%=(模等):把左边和右边的模赋给左边
?问个问题:
byte b = 5;
b = b + 2;
b += 2; //相当于b = (byte)(b+2);
System.out.println(b); 会不会报错?
答:不会,因为+=运算符在给b赋值时,自动完成了强转(强制类型转换)操作。
注意:简捷赋值运算符在给左边变量赋值时,自动完成了强转操作。
3、比较运算符
符号:==(等于)、!=(不等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)
比较运算符的结果都是boolean型,要么是true,要么是false。
注意:判断两个数是否相等时,用比较运算符“==”不能误写成“=”,这是初学者,甚至是很多老程序员易犯的错误。
4、逻辑运算符
符号:&(与)、|(或)、^(异或)、!(非)、&&(短路与)、||(短路或)
作用:逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
A:逻辑与运算符 &:当且仅当左右两边都为true时,结果才为true。
B:逻辑或运算符 |:当且仅当左右两边都为false时,结果才为false。
C:逻辑异或运算符 ^:左右两边相同,结果为false。
D:逻辑非运算符 !:左边为true,结果为false;左边为false,结果为true。
E:短路与 &&:
?当且仅当左右两边都为true时,结果才为true。
?和&的区别:
&:左边无论什么结果,右边都执行。
&&:左边为false,右边不执行,结果为false。
F:短路或 ||:
?当且仅当左右两边都为false时,结果才为false。
?和|的区别:
|:左边无论什么结果,右边都执行。
||:左边为true,右边不执行,结果为true。
5、位运算符
符号:<<(左移)、>>(右移)、>>>(无符号右移)、&(与运算)、|(或运算)、^(异或运算)、~(反码)
作用:位运算是直接对二进制进行运算。(由于是直接对二进制进行操作,位运算的计算效率很快。)
A:左移运算符:<<
?将一个数的二进制向左移:被移除的高位丢弃,空缺位补0。
?一个正整数向左移动几位就乘以2的几次幂
经典面试题:最有效率的方式算出2乘以8等于几? 答:2<<3;
B:右移运算符:>>
?将一个数的二进制向右移:高位是0,空缺位就补0;高位是1,空缺位就补1。
?一个正整数向右移动几位就除以2的几次幂
经典面试题:最有效率的方式算出128除以16等于几? 答:128>>4;
C:无符号右移:>>>
将一个数的二进制向右移:无符号右移无论最高位的符号位无论是0还是1,空缺位都补0。
D:与运算:&
将两个数的二进制位上下对齐,将每个二进制位进行 & 运算,只有1&1时结果是1,否则是0。
E:或运算:|
将两个数的二进制位上下对齐,将每个二进制位进行 | 运算,只有0 | 0时结果是0,否则是1。
F:异或运算:^
?将两个数的二进制位上下对齐,将每个二进制位进行 ^ 运算,任何相同二进制位进行 ^ 运算,结果是0,1^1=0 ,
0^0=0;不相同二进制位 ^运算结果是1,1^0=1 , 0^1=1。
?特点:一个数异或同一个数两次,结果还等于这个数。
?原理:当一个数异或另一个数两次,即相当于这个数的二进制位和另一个数的每个对应二进制位异或两次,因为
1^1^1=1,1^0^0=1,0^1^1=0,0^0^0=0,所以,这个数的每个二进制位都不变,结果还是这个数。
?应用:数据加密
典型例题:如何对两个整数变量的值进行互换(不需要第三方变量)?
答:
1 int n = 3,m = 8; 2 System.out.println("n="+n+",m="+m); 3 4 n = n ^ m; 5 m = n ^ m;//(n^m)^m; 6 n = n ^ m;//n ^ (n ^ m) 7 8 System.out.println("n="+n+",m="+m);
G:总结:
-
位运算符只能用于整数类型(byte、short、int、long 和 char)
-
位运算中涉及的字符应该转换成整数
-
所有的位运算符都能构成位赋值运算符,如 &=、|=、<<=、>>=、>>>= 等。
注意:&、|、^既能作位运算符也能作逻辑运算符,当他们操作布尔型表达式的时候就是逻辑运算符,当他们直接操作数值的时候就是位运算符。
反码运算:~
将一个数的二进制位,1变成0,0变成1。
6、条件运算符(Java中唯一的三元运算符)
格式:
(条件表达式)?表达式1:表达式2;
?如果条件为true,运算后的结果是表达式1,表达式2不执行;
?如果条件为false,运算后的结果是表达式2,表达式1不执行;
?分号":"两边表达式运算结果的数据类型不同时会进行数据类型提升;
例如:
1 class SanYuan { 2 public static void main(String[] args) { 3 int n = 13; 4 System.out.println(n>9?(char)(n-10+‘A‘):n); 5 System.out.println(n>9?(char)(n-10+‘A‘):n++); 6 System.out.println(n); 7 /* 8 运行结果:68 9 68 10 13 11 原因:因为三元运算符的表达式2是int型, 12 虽然因为条件表达式结果为true,表达式2不执行。 13 但表达式1的数据类型会被提升回int型。 14 */ 15 } 16 }
特点:条件运算符运算完之后一定有一个结果。
7、运算符的优先级
A:问题:int a = 3,b = 4; System.out.println("a + b = " + 3 + 4); 会输出什么呢?
答:输出a + b =34,原因是运算是从左到右进行的,所以3和4之间的“+”号会作为连接符而非加号,这涉及到了运算符的优先级。
B:运算符的优先级和结合方向
8、转义字符
A:定义:通过\ 来转变后面字母或者符号的含义。
B:常见转义字符的含义:
\n:换行
\b:退格,相当于backspace。
\r:按下回车键,Window系统,回车符是由两个字符来表示\r\n.
\t:制表符,相当于tab键。
\f:换页
\\:反斜杠
\‘:单引号
\":双引号
注意:转义字符”\“连同”被转义的字母“共同组成一个新的字符,所以 char = ‘\n‘;的语句是正确的,不会编译失败。