1.1. 关键字
什么是关键字
定义 :被 Java 语言赋予了特殊含义的单词。
特点 :关键字中所有字母都为小写。
小实验:
使用 EditPlus 编辑器写一个Hello World输出程序。
编辑器中蓝色字体就是关键字,红色字体就是 JDK 自己为我们所提供的类。
注意:
1、所有的关键字都不需要记忆,在后期的学习中慢慢就掌握了。
2、EditPlus默认会创建一个bak备份文件,如果不想创建备份文件,只需要通过如下操作:
点击Tools–>Preferences–> File –>勾掉Create backup file when saving。
1.2. 标识符
定义 :在程序中自定义的一些名称。 自己的名字
特点 :由26个英文字母大小写,数字:0-9,符号:_ $ 组成。
定义合法标识符规则:
1、数字不可以开头。
2、不可以使用关键字。
注意:
1、 java 中严格区分大小写。
2、在起名字的时,为了提高阅读性,要尽量有意义。
3、公司中经常会通过“_”代表某一类名称,例如:_temp。
通过“$”代表外部类与内部类的关系(后面会讲到),例如:TrafficLamp$Red。
Java中的名称规范:
包名:多单词组成时所有字母都小写。
例如:xxxyyyzzz com.doitedu.hangge
类名接口名:多单词组成时,所有单词的首字母大写。
例如:XxxYyyZzz class XuRuiHang {}
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。
例如:xxxYyyZzz xuRuiHang()
常量名:所有字母都大写。多单词时每个单词用下划线连接。
例如:XXX_YYY_ZZZ XU_RUI_HANG = 3;
1.3. 注释
定义 :用于注解说明解释程序的文字就是注释。
特点 :提高了代码的阅读性。
Java中的注释格式:
单行注释
格式: //注释文字
多行注释
格式: /* 注释文字 */
文档注释
格式:/** 注释文字 */
例如:
/** |
注意:
1、对于单行和多行注释,被注释的文字,不会被 JVM ( java虚拟机 )解释执行。
2、对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
3、注释是一个程序员必须要具有的良好编程习惯。初学者编写程序可以养成习惯:先写注释再写代码。
4、将自己的思想通过注释先整理出来,在用代码去体现。因为代码仅仅是思想的一种体现形式而已。
5、单行注释可以嵌套单行注释,单行注释可以嵌套多行注释,多行注释可以嵌套单行注释。
但是,多行注释不能嵌套多行注释,因为多行注释的开头会和被嵌套的多行注释的结尾配对,导致后面的注释失效。
6、可以使用注释对代码中的错误进行定位。
1.4. 常量
定义: 常量表示不能改变的数值。
Java中常量的分类:
1、整数常量,所有整数。
2、小数常量,所有小数。
3、 布尔 (boolean)型常量,只有两个数值。true、false。
4、 字符常量 ,将一个数字字母或者符号用 单引号 ( ‘ ‘ )标识。
5、 字符串 常量,将一个或者多个字符用 双引号 (“”)标识。
6、null常量,只有一个数值就是:null。
对于整数,有三种表现形式:
八进制:0-7,满8进1,用0开头表示。
十 进制 :0-9,满10进1。
十六进制:0-9,A-F,满16进1,用0x开头表示。
进制的由来:
任何数据在计算机中都是以 二进制 的形式存在的。二进制早期由电信号开关演变而来。
一个整数在内存中一样也是二进制的,但是使用一大串的1或者0组成的数值进行使用很麻烦。
所以就想把一大串缩短点,将二进制中的三位用一位表示。这三位可以取到的最大值就是7,超过7就进位了,这就是 八进制 。
但是对于过长的二进制变成八进制还是较长,所以出现的用4个二进制位表示一位的情况,四个二进制位最大是15,这就是十六进制。
规律:进制越大,表现形式越短。
小实验:
使用计算器进行进制转换。
打开计算机,点击“查看”–>“程序员”。
在十进制下,输入1000。
然后点击二进制,结果如下:
注意:
1 byte = 8bit 字节
1k = 1024byte
附:进制的基本转换
①十进制 二进制 互转
例如:
1011 = 1*2(0)+1*2(1)+0*(2)+1*2(3)= 1 + 2 + 0 + 8 = 11
附: 括号中的数值代表次方。
②十进制 八进制 互转
例如:
十进制 43
二进制 0101011
三位分割 010-101-110
八进制 2 5 6
因此,0101011 = 0256
结论:
八进制,其实就是二进制位,3个二进制位,1个八进制位。
③十进制 十六进制 互转
十进制 43
二进制 0101011
四位分割 1010-1110
十六进制 10(A) 14(E)
因此,0101011 = 0AE
结论:
十六进制,其实就是二进制位,4个二进制位,1个十六进制位。
负数的二进制表现形式:
对应的正数二进制取反加1。
求-6的二进制表现形式:对应的正数6二进制取反加1。
0000-0110
取反 1111-1001
加1+0000-0001
—————–
1111-1010
注意:
负数的二进制最高位永远是1。
1.5. 变量
定义: 内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在同一类型范围内不断变化。
用来不断的存放同一类型的常量,并可以重复使用。
特点 :变量其实就是将不确定的数据进行存储。也就是需要在内存中开辟一个空间。
定义变量的格式:
数据类型 变量名 = 初始化值;
例如:byte b = 3;
注意:
1、格式是固定的,记住格式,以不变应万变。
2、变量的作用范围(一对{}之间有效)。
理解:
变量就如同数学中的未知数X。
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
数据类型包括8种基本类型,3种引用类型。
注意:
整数默认类型:int类型,小数默认类型:double类型。
常见问题:
问题一:
错误原因:
由于整数默认类型是int类型,如果数值超过了int类型的范围,那么就会报出如上错误。
即使是赋值给long类型的变量,但是后面的常量已经超过了int类型的范围,同样会报错。
解决方法:
在数值后面加上一个“l”,就可以让编译器知道后面的常量是long类型的。
问题二:
错误原因:
由于小数默认是double(8byte)类型,赋值给 float (4byte)类型的变量,当然可能会损失精度。
解决方法:
在数值后面加上一个“f”,就可以让编译器知道后面的常量是float类型的。
问题三:
错误原因:
由于变量y是未初始化的,所以不能直接操作。
解决方法:
一定要为变量y先赋值,再打印输出。
问题四:
错误原因:
由于变量z的作用范围是在一对{}之间有效,超出这个范围就失效了。所以,找不到z这个符号。
解决方法:
将大括号去掉,或者在大括号里面打印变量z。
1.6. 类型转换
类型转换在开发中也很常用,简单来说就是类型之间相互的转化,类型转换共分两种,自动类型转换和强制类型转换。
1.6.1. 自动类型转换(隐式类型转换)
定义:自动类型转换就是不需要我们手动对类型来进行强制转换。
例如:
int类型的变量占4个字节,当byte类型的变量与其相加的时候,首先会将byte类型的变量自动转化为4个字节的int类型,然后再进行加法操作。
1.6.2. 强制类型转换(显式类型转换)
定义:强制类型转换需要把类型进行手动转换,否则无法正常使用
例如:
错误原因:
当byte类型的变量提升为int类型与int类型的常量200相加后,结果依然是int类型。再赋值给byte类型,当然会出现损失精度的错误。
解决方法:
进行强制类型转换,也就是将占4个字节的int类型值,再强硬存储到占1个字节的byte变量中。
结果为-53的原因是,200+3结果是203,换算成占1个字节空间的二进制也就是11001011。
由于首位为1,所以是负数,除符号位外,其余部分取反加1,得1,0110101,即-53。
注意:
1、只有数值类型才能进行加法操作,非数值类型不行!
例如:
2、 char 类型数据也可以和int类型相加,但是首先char类型数据会被自动提升为int类型。
例如:
字符类型数据之所以能够自动提升为int类型是因为字符类型数据在计算机中也是用0、1表示的,int类型数据在计算机中也用0、1表示,当然可以转换为int类型数据。
但是,字符类型数据在计算机中使用0、1是按照何种顺序组合排列的则需要依据某个码表而定。
Java中的内置码表是 Unicode ,既包含中文,也包含英文。
注意:
通过强转也可以把数字强转成字符。
例如:
表达式的数据类型自动提升
所有的byte型、short型和char的值将被提升到int型。
如果一个操作数是long型,计算结果就是 long 型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
面试难题:
说出报出如下错误的原因:
错误原因涉及到编译器编译程序时候的细节:
之所以byte b = 3 +7;没有报错,是因为3和7都是常量,编译器知道结果是10,并且在byte范围之内,因此就自动进行了强转,所以不会报错。
而b = b1 + b2;中b1和b2都是变量,编译器编译程序是一行一行编译的,它根本不知道b1和b2到底是多少,两个byte类型的数据相加时,首先都会被提升为int类型,他们的和也是int类型,其值可能会超过byte的范围,因此就会报错。
而如下程序则不会报错:
原因是因为int类型的两个变量相加,最后还是int类型,虽然结果溢出,但是不会报错。
例子1:
注意:
整数与整数相除时,结果永远是整数,小数部分被忽略。
例子2:
注意:
负数对正数取模结果为负数。
正数对负数取模结果为正数。
例子3:
注意:
加号也可以作为连接符使用。
例子4:
注意:
例子4在计算机中的实际操作为:当执行b = a++;语句时,先把a放在一个临时内存空间中,然后将a自加1,再将临时内存空间中的a赋值给b,因为b还是原来的a的值,也就是3。
注意:
当执行b = ++a;语句时,先将a自加1,再将a赋值给b,因此b的值是4。