Java基础
一、注释
1.单行注释
2.多行注释
3.文档注释
格式:
/**
@author 指定Java程序的作者
@version 指定源文件的版本
*/
注:注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档。
二、标识符
规则:
- 标识符由字母、下划线、美元符号和数字组成,长度不受限制。
- 标识符的第一个字符不能是数字字符。
- 标识符不能是关键字。
- 标识符不能是true、flase和null(尽管它们不是关键字)。
规范:
- 每个名字可以由几个单词连接而成。
- 对于类名、接口名,每个单词的开头字母应大写。eg:YourName
- 对于方法名和变量名,类似类名的命名规则。但第一个字母不用大写。eg:yourMethod() yourVariable
- 常量应该用全部大写的标识符,多单词时每个单词用下划线连接。eg:YOURNAME
- 包名应该全部用小写。
注:
- 标识符中的字母是区分大小写的。
- Java采用Unicode字符集,因此标识符也可以用汉字声明,但是非常不建议用。
三、数据类型
基本数据类型
1.数值型
整数类型(byte,short,int,long)
类型 | 占用储存空间 | 范围 |
---|---|---|
byte | 1字节=8bit位 | -128~127 |
short | 2字节 | -2^15~2^15-1 |
int | 4字节 | -2^31~2^31-1(约2亿) |
long | 8字节 | -2^63~2^63-1 |
注
- Java整数类型默认int型,声明long类型常量必须加'l'或'L'。
浮点类型
类型 | 占用存储空间 |
---|---|
float | 4字节(精度是7位有效数字) |
double | 8字节(精度是float的两倍) |
注:
- Java的浮点型常量默认double型,声明float型常量,必须加'f'或'F'
2.字符型(char)
字符变量的三种表现形式:
- 字符常量是用单引号括起来的单个字符。
- Java中还允许使用转义字符' \ ' eg:char c = '\ n'
- 直接使用Unicode
3.布尔型(boolean)
只有ture和false
4.基本数据类型之间的运算规则
自动类型提升:
当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
byte、char、short --> int --> long --> float --> double
注:当byte、char、short 三种类型的变量做运算时,结果为int型
强制类型转换:
注:需要使用强制转换符:()。强制类型转换,可能导致精度损失。
class VariableTest {
public static void main(String[] args) {
double d1 = 12.9;
int i1 = (int)d1;
System.out.println(i1); //精度损失,输出12(不存在四舍五入)
long l1 = 123;
short s2 = (short)l1; //没有精度损失
int i2 = 128;
byte b= (byte)i2;
System.out.println(b); //输出-128 精度损失
}
}
5.可能遇到 的一些情况
1.long型变量后面为加 l 或 L
long l = 123213;
System.out.println(l); //编译失败,过大的整数,当位加后缀时,默认位int型
long l =123213l;
System.out.println(l); //编译成功
2.整型常量默认为int型,浮点型常量默认为double型。
float f1 = 12.3; //编译失败,float型后面必须加后缀。
byte b = 12;
byte b1 = b + 1; //编译失败,1为int型,byte型和int型的运算必须存储在int型的变量中。
byte f1 = b + 12.3; //编译失败,原因同上。
引用数据类型
1.类(class)
字符串String
String不是基本数据类型,属于引用类型数据类型
- 使用方法与基本数据类型一致。eg:String str = "abcd";
- 一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。(不能进行与其他数据类型的运算)
- 结果仍为String类型
class StringTest {
public static void main(String[] args) {
String s1 "hello world";
String s2 = "a";
String s3 = ""; //可以为空
char c = ''; //编译失败,char类型不能为空,必须包含一个字符
}
}
class exercise {
public static void main(String[] args) {
System.out.println("* *");
System.out.println('*' + '\t' + '*');
System.out.println('*' + "\t" + '*');
System.out.println('*' + '\t' + "*");
System.out.println('*' + ('\t' + "*"));
}
}
2.接口(interface)
3.数组([])
1.一维数组
声明:
数组的数据类型[ ] 数组名字 = new 数组存储的数据类型[数组长度]; 数组的数据类型 数组名字[ ] = new 数组存储的数据类型[数组长度];
int[] arr = new int[]{1,2,3,4,5};
// 可以拆分
int[] arr;
arr = new int[]{1,2,3,4,5};
两种初始化方式:
//静态初始化:数组的初始化和数组元素的赋值同时进行。
int[] num = new int[]{121,232,123,123};
//动态初始化:数组的初始化和数组的赋值分开进行。
String[] names = new String[5];
调用数组元素:
String[] names = new String[4];
names[0] = "王看1";
names[1] = "王看2";
names[2] = "王看3";
names[3] = "王看4";
数组的默认初始化值:
数组元素类型 | 默认初始化值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
char型 | 0或'\u0000' |
Boolean型 | false |
应用数据类型 | null |
2.二维数组
声明:
数组元素类型[] [] 数组名 = new 数组类型[行] [列];
数组元素类型 数组名[] [] = new 数组类型[行] [列];
数组元素类型[] []数组名 = new 数组类型[行] [列];
int[][] array1 = new int[10][10];
int array2[][] = new int[10][10];
int array4[][] = new int[][] { { 1, 1, 1 }, { 2, 2, 2 } };
int array3[][] = { { 1, 1, 1 }, { 2, 2, 2 } };
两种初始化方式:
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{1,4,2},{3,4,6,7,4}};
//动态初始化
String[][] arr2 = new String[2][3];
String[][] arr3 = new String[2][]; //行不能省略,列可以省略
3.常见数组类的使用
数组工具类 | 简介 |
---|---|
boolean equals(int[] a,int[] b) | 判断两个数组是否相等 |
String toString(int[] a) | 输出数组信息 |
void fill(int[] a,int val) | 将指定值填充到数组之中 |
void sort(int[] a) | 对数组进行排序(从大到小) |
int binarySearch(int[] a,int key) | 对排序后的数组进行二分法检索指定的值 |
//1.boolean equals(int[] a,int[] b)
int [] arr1 = new int[]{1,2,3,4};
int [] arr2 = new int[]{1,3,2,4};
boolean isEquals = Arrays.equals(arr1,arr2);
System.out.println(isEquals);
//2.String toString(int[] a);
System.out.println(Arrays.toString(arr1));
//3.void fill(int[] a,int val);
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));
//4.void sort(int[] a);
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
//5.int binarySearch(int[] a,int ley);
int[] arr3 = new int[]{-98,-23,3,5,32,54,456,678,766};
int index = Arrays.binarySearch(arr3,210);
4.数组常见异常
1.数组下标越界异常
2.空指针异常
//情况一:
int[] arr1 = new int[]{1,2,3};
arr1 = null;
System.out.println(arr1[0]);
//情况二:
int[][] arr2 = new int[4][];
System.out.println(arr2[0][0]);
//情况三:
String[] arr3 = new String[]{"AA","BB","CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());
四、运算符
1.算数运算符
运算符 | 运算 |
---|---|
+ | 正号 |
- | 负号 |
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模 |
a++;++a | 自增 |
a--;--a | 自减 |
+ | 字符串连接 |
注:自增自减运算符不会改变原本的数据类型
2.赋值运算符
- =
- +=
- -=
- *=
- /=
- %=
3.比较运算符
运算符 | 运算 |
---|---|
== | 相等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
instanceof | 检查是否是类的对象 |
注:比较运算符的结果都是boolean型,要么true要么false
4.逻辑运算符
**&**逻辑与 **&&**短路与
**|**逻辑或 **||**短路或
**!**逻辑非
**^**逻辑异或
a | b | a&b | a&&b | a|b | a||b | !a | a^b |
---|---|---|---|---|---|---|---|
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | ture | true | true |
false | false | false | false | false | false | true | false |
&与&&区别:
- &与&&的运算结果相同
- 当符号左边是true时,二者都会执行符号右边的运算。
- 当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
|与||区别:
- |与||的运算结果相同
- 当符号左边是false时,二者都会执行符号右边的运算。
- 当符号左边是true时,|继续执行符号右边的运算。||不再执行符号右边的运算。
5.位运算符
运算符 | 运算 | 范例 |
---|---|---|
<< | 左移 | 3<<2 = 12 |
>> | 右移 | 3>>1 = 1 |
>>> | 无符号右移 | 3>>>1 = 1 |
& | 与运算 | 6&3 =2 |
| | 或运算 | 6|3 = 7 |
^ | 异或运算 | 6^3 = 5 |
~ | 取反运算 | ~6 = -7 |
注:
位运算符是直接对整数的二进制进行的运算;
无<<<位运算符,只有无符号右移;
经典面试题:最高效方式的计算 2 * 8? 答:2<<3 或 8<<1
6.三元运算符
(条件表达式)?表达式1:表达式2;
7.优先级
优先级等级 | 运算符 |
---|---|
1 | . () {} ; , |
2 | ++ -- ~ !(data type) |
3 | * / % |
4 | + - |
5 | << >> >>> |
6 | < > <= >= instanceof |
7 | == != |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ? : |
14 | = *= /= %= |
15 | += -= <<= >>= |
16 | >>>= &= ^= |= |
五、流程控制
1.分支结构
1.if else 语句
if(条件表达式){
执行代码块;
}
if(条件表达式){
执行代码块2;
}else{
执行代码块2;
}
if(条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
}else if(表达式3){
执行代码块3;
}……{
执行代码块n;
}else{
代码块n+1;
}
2.switch语句
switch(表达式){
case 常量1:
语句1;
//break;
case 常量2:
语句2;
//break;
case 常量3:
语句3;
//break;
……
case 常量n:
语句n;
//break;
default:
语句;
//break;
}
注:
- 根据switch表达式中的值,一次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍继续向下执行其他case结构中的执行语句,直到遇到break关键字或switch结构末尾为止。
- switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
- default相当于if—else中的else。而且位置灵活。
2.顺序结构
3.循环结构
1.for循环
for(初始化条件;循环条件;迭代条件){
循环体;
}
2.while循环
初始化条件
while(循环条件){
循环体;
迭代条件;
}
3.do-while循环
初始化条件
do{
循环体;
迭代条件;
}while(循环条件);