为什么开始复习Java基础呢?有一天在验证一个字符串的问题时,发现数组的定义已经混乱了!!!
定下目标@me。
Java 基础(复习版)
- 每天面对代码4小时(●’◡’●)
- 目标(浅浅一想) :阿里,美团,滴滴,网易
基本语法
-
首先,回想一下一些基本的概念:
-
类:是一个模板,把一类事物的共性(行为和状态)描述出来。(人类,动物类)
-
对象:对象是类的一个实例(类的具体化,比如老师,学生;小狗,小猫),有状态和行为(状态也可以说属性,比如颜色,名字,爱好;行为就可以理解成功能,动作)。
-
方法:方法就是行为(或者动作),一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的(这样说的比较模糊,举个例子,人类实例化出一个学生对象,学生的学习)。
-
实例变量:每个对象的状态怎么表示呢?比如学生的名字是不可能一样的,所以实例变量就可以来描述不同对象的不同状态。
-
Java程序的入口main方法
public
是访问修饰符,表示该class
是公开的(访问权限)。不写public
,也能正确编译,但是这个类将无法从命令行执行。在class
内部,可以定义若干方法,方法就是一串可执行语句,在被调用时,内部的代码会被依次执行。
static
是表示静态方法,Java入口程序规定的方法必须是静态方法,方法名也必须是main,参数也必须是String数组。
void
定义方法的返回值类型 ,void为没有任何返回值。
编写 Java 程序时,应注意以下几点
-
大小写敏感:Java 是大小写敏感的,这就意味着标识符
Hello 与 hello 是不同的。
-
类名:对于所有的类来说,类名的首字母应该大写,后接字母,数字和下划线的组合。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如
classs MyFirstJavaClass
。 -
方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写,例如
void getName(){}
。 -
源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为
.java
。(如果文件名和类名不相同则会导致编译错误)。 -
主方法入口:所有的 Java 程序由
public static void main(String[] args)
方法开始执行。
变量和数据类型
- 在Java中,变量分为两种:基本类型的变量和引用类型的变量。变量必须先定义后使用,参与运算时,需要赋初始值。
- Java 基本数据类型初始值(默认值)
类型 | 默认值 |
---|---|
char | false |
boolean | ‘/u0000’(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
- 变量的作用范围:在定义变量的语句块有个作用域,一般控制语句都以{}为自身的范围。
运算
-
整数运算结果永远是整数(注:整数的除法对于除数为零运行报错但是编译不会报错)。求运算使用%。
-
如果结果超过了接收数值的类型的范围就会产生溢出不会报错,但是结果会出错,是因为二进制的最高位代表负,这时只要把接收的类型由小的改为大的就避免了溢出。
-
还有一些自增、位运算和移位运算。
-
运算符的优先级:
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
-
类型转换:
short
和int
计算,结果总是int
,原因是short
首先自动被转型为int
。也可以将结果强制转型,即将大范围的整数转型为小范围的整数。强制转型使用(类型)
。(注意:如果强转超出范围将会得到错误的结果) -
类型提升:参与运算的两个数的最终类型会变成范围最大的那个数的类型。
-
浮点数的运算不会出现整数那样的运行报错,会返回特殊值
NaN
表示Not a NumberInfinity
表示无穷大-Infinity
表示负无穷大
(浮点数强转成整数如果超出了整数的最大值。
-
关系运算符的优先级
!
>
,>=
,<
,<=
==
,!=
&&
||
-
三目运算符和短路运算
-
总结Java运算符的优先级:
-
单算移关与,异或逻条赋
括号级别最高,逗号级别最低,单目 > 算术 > 位移 > 关系 > 逻辑 > 三目 > 赋值。
-
运算符优先级一图掌握
-
优先级 运算符 结合性 1 ( ) [ ] .
从左到右 2 ! ~ ++ –
从右到左 3 * / %
从左到右 4 + -
从左到右 5 << >> >>>
从左到右 6 < <= > >=
instanceof
从左到右 7 == !=
从左到右 8 &
从左到右 9 ^
从左到右 10 |
从左到右 11 &&
从左到右 12 ||
从左到右 13 ? :
从左到右 14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>=
从右到左 15 ,
从右到左
-
-
-
字符串类型: 也就是
String
型(默认值是null),是引用数据类型。-
转义字符
\
(反斜杠)。\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示换行符\r
表示回车符\t
表示Tab\u####
表示一个Unicode编码的字符
-
字符串有不可变的特点,并不是无法多次赋值,而是由于字符串是引用数据类型所以赋值过的字符串会一直保留,只是变量的指向变了。
-
区分null和空字符串,空字符串也是一个有效的字符串。
-
数组
- 先来定义格式:
int [] a=new int [2];``a[0]=12;
,int[] b = new int[] {0,1};
ORint [] c={0,1}
数组类型+[]
,new int[2]
表示创建一个可以容纳两个元素的数组。(注意:new int [2]
代表2个元素即`a[0],a[1])- 数组初始化所有元素的默认值和数组类型的默认值一致。
- 要获取数组的大小
a.length
, - 数组是引用类型如果访问时索引越界会报错。
- 一旦创建数组大小就固定了(指元素数)。但是如果对上面的a重新赋值
int [] a={1,2,3,4,5}
,数组不就变了吗?其实由于数组是引用数据类型所以只是指向了新的元素,只是通过a查询不到原来的数组了。
流程控制
-
首先是Java提供的输出语句,
print(),println(),printf()
,前两个都已经很熟悉了,重点说一下格式化输出,通过使用占位符%?
来格式化输出参数(连续的两个%%表示%自身):-
占位符 说明 %d
格式化输出整数 %x
格式化输出十六进制数 %f
格式化输出浮点数 %e
格式化输出科学计数法表示的浮点数 %s
格式化字符串
-
-
输入比输出复杂得多,创建
Scanner
对象并传入System.in
。使用scanner.nextLine()
来接收用户输入的字符串scanner.nextInt
接收用户输入的整数,scanner会自动识别并转换数据类型。 -
if语句以及if else的嵌套。(
if else if...
的判断执行顺序是从上到下的) -
判断值类型相等可以用
==
,而判断引用类型数据相等用它则表示引用是否相等,所以判断引用类型数据的内容是否相等应该使用equals()
方法,在s2.equals(s1)
如果s2为null则会报NullPointerException
,如果是这里的s1为null则不会。 -
switch多重选择:
- switch语句会根据表达式计算的结果匹配对应的case执行其语句,直到遇到`break;;为止。
- switch语句具有穿透性,通过丢掉
break;
来实现。 - 默认执行语句要记得写。
-
区分
while(){}
,do{} while()
和for{}
循环的不同点,熟练使用。-
while
循环先判断循环条件是否满足,再执行循环语句;while
循环可能一次都不执行; -
do while
循环先执行循环,再判断条件;do while
循环会至少执行一次。 -
for
通过计数器可以实现复杂循环;for each
可以直接遍历数组的每个元素;计数器变量定义在
for
循环内部,循环体内部不修改计数器; -
break
和continue
:-
break
语句可以跳出当前整个循环;break
语句总是跳出最近的一层循环;continue
语句可以提前结束本次循环;
-
-
数组操作
-
遍历和排序:
-
遍历数组可以使用
for
循环,for
循环可以访问数组索引,for each
循环直接迭代每个数组元素,但无法获取索引; -
使用
Arrays.toString()
可以快速获取数组内容。 -
冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
-
Java内置了排序api,
Arrays.sort()
-
-
多维数组:
- 二维数组就是数组的数组,三维数组就是二维数组的数组;
- 多维数组的每个数组元素长度都不要求相同;
- 打印多维数组可以使用
Arrays.deepToString()
; - 最常见的多维数组是二维数组,访问二维数组的一个元素使用
array[row][col]
。
-
命令行参数:
- Java程序的入口是
main
方法,而main
方法可以接受一个命令行参数,它是一个String[]
数组。可以接收用户输入并传给main
方法,可以利用接收到的命令行参数,根据不同的参数执行不同的代码。例如,实现一个-version
参数,打印程序版本号。
- Java程序的入口是