在网上看了一些开源的项目,有些大神写的代码,让人第一眼看了感觉云里雾里的,但是细细的研究一下,发现写的真的是太无敌了,尽管我之前写代码的时候也用到了很多设计模式,也为代码的低耦合和简洁做足了努力,但是看到这些代码以后我感觉之前我的代码简直太弱了,这不得不让我重新审视一下Java
基础。于是看书以最快的速度复习一下。
基础概念
定义类
public class
定义,需要类名和文件名完全相同
class
定义,类名和文件名可以不同
同一个文件里面可以有多个class
,只能有一个public class
,main
方法不一定非要写在public class
中,但是执行的时候一定要使用java main方法所在的类的类名
Class
遵循大驼峰命名方式
System.out.println()
和System.out.print()
区别于换行
每一个语句一定要写分号;
结尾
注释
单行注释:
// 单行注释
多行注释:
/* 多行注释... */
文档注释:
作用是生成Javadoc
文档,当使用开发软件的时候,鼠标放到属性、方法或者类上面的时候,就显示这个类,方法,属性有什么意义,干什么用,方法中的参数有什么作用,返回值又有什么用,等等信息。
/** 文档注释 */
标识符与关键字
标识符意思就是名字,比如说变量的名字可以标识这个变量,所以变量的名字就是标识符。变量标识符使用小驼峰命名,标识符中是可以有$
符号的,只要不用莫名其妙的字符、不以数字开头、不使用了关键字就可以,程序员都懂。反正大家一般都不用$
符号,因为大部分情况$符号会在编译好的二进制文件中出现。对了,Java支持中文标识符。
关键字的话,不解释了。因为所谓的Java
基础就是不断的去认识新的关键字,知道每个关键字的作用和限制,不断的去避免写重复代码,不断的去认识语法,不断的去看懂源码...
assert
关键字JDK1.4
加入
enum
关键字JDK1.5
加入
const
和goto
是Java
的两个保留字,就是没有用到的关键字,但是他也是关键字
数据类型
数据类型有基本数据类型和引用数据类型两种。
8
种基本数据类型:
-
数值型(不涉及到内存的开辟)
- 整形:
byte
,short
,int
,long
- 浮点型:
float
,double
- 整形:
-
字符型:
char
-
布尔型:
boolean
3
种引用数据类型:
数组
,类
,接口
浮点型因为有精度的问题,所以不能用来存储精确的数字信息
经常使用byte
数组来存储二进制,布尔型也就是true
和false
,小数一般使用double
,一般是不用float
的,日期时间和文件大小使用long
。
从JDK10
开始可以使用var
关键字,来让JDK
自己推断数据类型。
整型
如果整形的最大值 + 1就变成了最小值,最小值 - 1就变成了最大值,也就是如果超出了范围就会做循环操作,但是如果用更大范围的数据类型接收这个结果,会得到正常的结果,因为数据会自动转型。
做运算的时候数据类型小一点的类型自动转成大的类型,大的类型如果要转换为小类型就需要强制转换。强制转换一定要注意数据溢出,也就是会做循环操作,所以将很大的long
类型数字赋值给int
类型,很有可能返回一个负数。
因为byte
数据比较常用,所以给byte
赋值一个int类型的数字,不用强制转型
这些数据类型的保存范围,可以用包装类型里面的MAX_VALUE
和MIN_VALUE
查看
大写和对应的小写字符之间差32
个ASCII
字符
如果直接使用整形进行 /
运算,默认是不会保留小数位的
浮点型
默认就是double
,如果要使用float
接收浮点型需要在数字后面写上F
或者f
,或者强制转型为float
数值类型的字面值可以写成3.15E2
字符型
字符型是可以和整形进行相加处理的。相加的结果是ASCII
码 + 整型
Java
字符型可以保存中文,但是系统环境需要支持中文
字符型必须只能存储一位字符
布尔型
Java
里面是不能使用1
和0
来描述布尔变量的。
字符串
字符串连接可以使用+
号连接,但是不推荐,因为这样会产生很多的垃圾。
在进行字符串+
操作的时候,如果连续加了两个数字,这两个数字是不会做+
操作的,可以用括号来解决这个问题
字符串的一些转义字符...,这个不说了。在字符串中使用“"
"的话需要转义的。
基本类型和字符串相加都等于String
运算符
数学运算符
+
、-
、*
、/
、%
简化数学运算符 +=
、 -=
...
++
自增,++
在前面,先自增,再参与运算,++
在后面先运算再自增
--
和上面的++
一样的道理
关系运算符
>
、<
、 ==
、 !=
、 >=
、 <=
数字可以和字符进行比较
但是需要注意的是,基本类型和基本类型比,引用类型和引用类型比,比如说用String
类型和10
进行比较就会报错,布尔值也是不能和数字进行比较的,尽量做到同类型比较吧。
三目运算符
三目运算符一般用来进行赋值操作,并且三目运算符可以无限的嵌套,不过就是有点乱。
逻辑运算符
&
、 &&
、 |
、 ||
、 !
非短路和短路的区别
短路意味着条件成立后就不再往后继续比较了,非短路成立后还会继续往后比较
位运算符
&
、|
、 ^
、 ~
、 >>
、 <<
、 >>>
&
:两个都为1才是1
|
:两个都是0才是0
^
:相同为0不同为1
2
的3
次方: 2 << 2
涉及到二进制的时候才用位运算,很多时候位运算非常好用,比如说颜色值,比如说Java
模拟JS
中的Uint8Array
等,具体的使用场景以后会用一篇文章具体分析。
逻辑控制
分支结构
if
、if ... else
、 if ... else if ...else
具体的用法没必要说,可以不适用大括号{}
,但是需要注意,如果不使用大括号,只执行最近的一条语句,剩下的语句不会被执行,所以一般还是写上大括号,不然不容易阅读还容易造成逻辑错误。
关于if ... else if ...else
可以使用switch
代替,但是switch
只能判断内容,JDK1.7
才加入String
类型的判断。
可以使用break
关键字来停止case
穿透
循环结构
for
、while
、do...while
do...while
至少会执行一次
循环条件一直成立叫做死循环,避免方法是在循环内部修改循环条件
明确知道循环次数的情况下使用for
循环
循环是可以嵌套的
continue
可以退出本次循环
break
可以跳出当前整个循环,但是无法结束嵌套循环
方法
定义和使用
方法必要的三部分是参数,过程,返回值
如果没有返回值使用void
关键字,如果有返回值一个return
都不能少
方法名使用小驼峰命名
重复的代码一定要定义为方法,如果因为类型不同不能提取出一个方法,就考虑使用多态,使用泛型,总之,代码要考虑结构的合理性。
如果执行到了return
语句,那么后面的代码就不会被执行了,没有返回值的方法也可以使用return
来停止方法的执行
方法的重载
名称相同,参数类型或个数不同,JVM
会根据调用时候参数的数量和类型来选择执行哪个方法,尽量使重载的方法返回值相同,强调一下重载和返回值没有关系。
方法递归调用
自己调用自己就是递归
一定要有递归出口,不然内存溢出,每次调用时必须改变传过来的参数,不然就不会有出口。