基础语法

Type 数据类型

数据类型分为基本数据类型与引用数据类型

基本数据类型 引用数据类型
byte 整形(-2^7~2^7-1) class 类(String 字符串类与 Date 类都包含在内)
short 整形(-2^15~2^15-1) interface 接口
int 整形(-2^31~2^31-1) array 数组
long 整形(-2^63~2^63-1) enum 枚举
float 单精度浮点数 annotation 注解
double 双精度浮点数
char 字符类
boolean 布尔值(默认值为 false)

注意:在java中浮点数的默认类型为double

类型转换

自动类型转换(Widening Casting)

自动类型转换是将一个小容量的数据类型转换为大容量的数据类型,这种转换是自动进行的,不需要强制转换符号

1
2
3
int i = 100;
long l = i; // 自动类型转换从int到long
float f = l; // 自动类型转换从long到float

自动类型转换遵循以下两种顺序

1
2
3
byte -> short -> int -> long -> float -> double

char -> int -> long -> float -> double

强制类型转换(Narrowing Casting)

强制类型转换,可以理解为自动类型转换的逆过程,将大容量的数据类型转换为小容量的数据类型,使用时需要在前面加上强制类型转换符号(),该符号应放在变量或数值前,内容为想要转化成的目标类型。

对引用类型进行强制转换时,又分为向上转型(upcasting)和向下转型(downcasting)

向上转型(upcasting)

向上转型是将一个子类引用赋给父类引用,这种转换是自动的,无需转换符

1
2
3
4
class Animal {}
class Dog extends Animal {}

Animal animal = new Dog(); // 向上转型

向下转型(downcasting)

向下转型是一个父类引用赋给子类引用,需要转换符

1
2
Animal animal = new Dog();
Dog dog = (Dog) animal; // 向下转型

类型检查

Java在编译时会进行类型检查,此处检查的依据是对象的静态类型而非动态类型,因此有时需要在代码中添加显式的“强制类型转换”来“告诉”编译器此时这个对象该被视做什么,但实际上并未改变该对象类型

1
Dog largerdog = (Dog)maxAnimal(animal1,animal2);

但这种操作也有风险,一个重庆人一定是中国人,但一个中国人却不一定是重庆人,这就导致了可能发生类型转换错误:

1
2
3
4
Dog dog = new Dog("大黄",3);
Cat cat = new Cat("咪咪",5);

Dog largerdog = (Dog)maxAnimal(dog,cat);

以上代码使用了强制类型转换使得右侧的函数得以成功进行(使Java认为dog和cat都是Dog),但接下来返回了cat,此时又将cat赋值给了一个Dog类的largerdog(这是非法的),所以程序会崩溃。

Variables 变量

存储某种特定类型的值的命名

Eg:String fxxkSchool

从上可以看出变量的格式一般为“变量类型 变量内容”

operators 运算符

运算符可分为算数运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,条件运算符

算数运算符 + - * / % ++ —

运算符 功能说明
+ 作正号时表示正数属性;作加法运算符,用于数值相加;在与字符串操作时,用于连接字符串 。比如 +5 表示正 5 ,3 + 2 结果是 5 ,"Hello" + "World" 结果是 "HelloWorld"
- 作负号时表示负数属性;作减法运算符,用于数值相减 。比如 -3 表示负 3 ,5 - 3 结果是 2 。
* 乘法运算符,用于数值相乘 。例如 3 * 4 结果是 12 。
/ 除法运算符,用于数值相除 。例如 6 / 2 结果是 3 。当参与运算的数都是整数时,结果为整数(向下取整),如 7 / 2 结果是 3 。
% 取模(求余数)运算符,用于获取两数相除的余数 。例如 7 % 2 结果是 1 。
++ 自增运算符,分为前置自增(++a ,先将变量值加 1 ,再参与其他运算 )和后置自增(a++ ,先参与其他运算,运算结束后变量值加 1 )。比如 int a = 3; int b = ++a; ,此时 ab 都是 4 ;int c = 3; int d = c++; ,此时 c 是 4 ,d 是 3 。
自减运算符,分为前置自减(--a ,先将变量值减 1 ,再参与其他运算 )和后置自减(a-- ,先参与其他运算,运算结束后变量值减 1 )。原理与自增运算符类似 。

一些小事

  • 字符串间的串联通过“+”来连接的例子
1
2
3
String text = “Fxxk” + ”you”;
text = text + “BUPT” + 114514;
//text = “Fxxk you BUPT 114514”
  • “/”对于整形和浮点数的运作方式是不同的
1
2
3
double a = 5/2 // a = 2.5;

int b = 5/2 // b = 2;

赋值运算符 =

=的功能为将其右边的值赋值给左边,由此还能衍生出一些赋值运算符比如+=,-=等等

Java始终会对类型进行验证是否匹配,你不能把一个整形赋值给字符串

比较运算符 == != < > <= >= instanceof

比较运算符的返回值为布尔值

其他的都没啥好说的,讲一下instanceof,该运算符只能用于引用数据类型,用于检查是否为类的对象,比如”hello” instanceof String的返回值为true

逻辑运算符 & | ! && || ^

逻辑运算符同样返回布尔值

运算符 名称 运算规则说明 示例
& 逻辑与 对多个布尔表达式进行“与”运算,只有当所有表达式结果都为 true 时,整个表达式结果才为 true ,且会判断所有条件。 boolean a = true; boolean b = false; boolean result = a & b;resultfalse
| 逻辑或 对多个布尔表达式进行“或”运算,只要有一个表达式结果为 true ,整个表达式结果就为 true ,且会判断所有条件。 boolean a = true; boolean b = false; boolean result = a | b;resulttrue
! 对单个布尔表达式取反,若原表达式为 true ,结果为 false ;若原表达式为 false ,结果为 true boolean a = true; boolean result =!a;resultfalse
&& 短路与 与逻辑与功能类似,当多个布尔表达式进行“与”运算时,只要有一个表达式结果为 false ,就不再判断后续表达式,直接返回 false ;只有所有表达式都为 true ,结果才为 true boolean a = false; boolean b = true; boolean result = a && b; ,因为 afalse ,不会判断 bresultfalse
|| 短路或 与逻辑或功能类似,当多个布尔表达式进行“或”运算时,只要有一个表达式结果为 true ,就不再判断后续表达式,直接返回 true ;只有所有表达式都为 false ,结果才为 false boolean a = true; boolean b = false; boolean result = a || b; ,因为 atrue ,不会判断 bresulttrue
^ 异或 对两个布尔表达式进行运算,当两个表达式结果不同时,结果为 true ;当两个表达式结果相同时,结果为 false boolean a = true; boolean b = false; boolean result = a ^ b;resulttrueboolean c = true; boolean d = true; boolean result2 = c ^ d;result2false

位运算符 << >> >>> & | ^ ~

位运算符能够对整数类型的二进制位进行操作

运算符 说明
<< 空位补0,被移除的高位丢弃,空缺位补0。
>> 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
>>> 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& 二进制位进行&运算,只有1&1时结果是1,否则是0。
^ 相同二进制位进行 ^ 运算,结果是0;1^1=0,0^0=0。不相同二进制位 ^ 运算结果是1;1^0=1,0^1=1。
~ 正数取反,各二进制码按补码各位取反;负数取反,各二进制码按补码各位取反。

条件运算符 布尔表达式?表达式1:表达式2

先判断布尔表达式的结果是 true 还是 false,如果是 true,则选择表达式 1 的结果作为整个表达式的结果,反之则选择表达式 2 的结果作为整个表达式的结果。

循环语句

java中的循环语句分为三种:while,do/while和for循环

while循环

1
2
3
while (条件表达式) {
循环体;
}

do/while循环

1
2
3
4
do {
循环体;
} while (条件表达式)
//该循环与while循环不同的是会先执行一次循环体,再去检查循环条件

for循环

1
2
3
for (初始化表达式; 条件表达式; 迭代表达式) {
循环体;
}

方法 Method

Java中的方法类似于其它语言的函数,对某个功能的代码进行封装并为其命名,可以重复调用,所有的方法都需要定义到类中

1
2
3
4
5
6
7
8
9
public static void METHOD(){
STATEMENTS;
}
// public 访问权限
// static 静态
// void 返回值类型
// METHOD 自定义的方法名
// () 参数列表
// { STATMENT } 方法体

数组 [] array

数组是一组相同数据类型的集合,是一个容器(可以想象成相连的空间小方格,即每个元素空间是相连的),它可以存储基本数据类型和引用数据类型,数组本身是引用数据类型,在创建时必须指明长度,且后续无法对长度进行改变

创建数组的三个方法:

1
2
3
int [] a = new int [3];
int [] b = new int[]{1, 2, 3};
int [] c = {1, 2, 3};

打印数组的三个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
**//方法一:for循环**
public static void main(String args[]){
int[] arr = new int[] {1, 2, 3};
for (int i = 0;i < arr.length;i++){
System.out.print(arr[i] + ",");
}
}//二维数组用循环嵌套即可
**//方法二:Arrays.toString()/Arrays.deepToString()**
//对于一维数组,我们使用Arrays.toString()方法,它支持将任何类型的数组转换为字符串
public static void main(String args[]){
int[] arr = new int[]{1,2,3};
System.out.println(Arrays.toString(arr));
}
//对于二维数组,使用上方方法会打印出二维数组的内存地址信息,这时需要用Arrays.deepToString()方法
public static void main(String args[]){
int[][] arr = new int[][] {{1,2},{3,4},{5,6}};
System.out.println(Arrays.deepToString(arr));
}
//方法三:Arrays.asList(),该方法能将数组转化为list
public static void main(String[] args){
int[] arr = new int[]{1,2,3};
System.out.println(Arrays.asList(arr));
//打印结果为[[I@b4c966a]
Integer[] array = new Integer[]{1,2,3};
System.out.println(Arrays.asList(array));
//打印结果为[1, 2, 3]
}
**//使用该方法时需要注意:
//1.该方法不适用于基本数据类型,但可以使用基本数据类型的封装类(int->Integer,Object数组也有效)
//2.该方法将数组与列表连接起来,其中一个更新时,另外一个也更新
//3.该方法不支持add和remove方法**

复制数组的方法:arraycopy(a,b,c,d,e)

从数组a的第b项开始复制,从数组c的第d项开始粘贴,共粘贴e项

1
2
3
4
5
6
public static void main(String args[]){
int [] arr1 = new int[] {1,2,3};
int [] arr2 = new int[5];
System.arraycopy(arr1,0,arr2,1,3);
System.out.println(Arrays.toString(arr2));
}