JavaSE
一、走进Java语言
二、面向过程编程
1. 注释
//单行注释
/*
多行注释
*/
/**
* 特殊注释
*
*/
2. final关键字
希望常量的值不变,用final修饰的变量只有第一次赋值时可以修改
public static void main(String[] args) {
final int a;
a = 777; //第一次赋值
}
3. 二进制
一个位也叫一个bit,8个bit称为1字节,16个bit称为一个字,32个bit称为一个双字,64个bit称为一个四字,我们一般采用字节来描述数据大小。
注意这里的bit跟我们生活中的网速MB/s是不一样的,小b代表的是bit,大B代表的是Byte字节(8bit = 1Byte字节),所以说我们办理宽带的时候,100Mbps这里的b是小写的,所以说实际的网速就是100/8 = 12.5 MB/s了。
符号数
首位是符号位(1代表负数,0代表正数),下面四个bit为例:
- 原码:计算机不好运算
- 最大:0111 => 7
- 最小:1111 => -7
- 反码:有正(0000)负(1111)零
- 正数的反码是其本身
- 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
- 补码:最终解决方案
- 正数的补码就是其本身 (不变!)
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(即在反码的基础上+1,此时1000表示-8)
- 对补码再求一次补码就可得该补码对应的原码。
比如-7原码为1111,反码为1000,补码就是1001了,-6原码为1110,反码为1001,补码就是1010。所以在补码下,原本的1000就作为新 > 增的最小值-8存在。
所以现在,1111代表的不再是-0,而是-1,相应的,由于消除-0,负数多出来一个可以表示的数(1000拿去表示-8了),那么此时4bit位能够表示的范围是:-8~+7(Java使用的就是补码!)在了解了计算机底层的数据表示形式之后,我们再来学习这些基本数据类型就会很轻松了。
public static void main(String[] args) {
int a = 2147483647; //int最大值
a = a + 1; //继续加
System.out.println(a);
}
什么情况???怎么正数加1还变成负数了?请各位小伙伴回想一下我们之前讲解的原码、反码和补码。
我们先来看看,当int为最大值时,二进制表示形式为什么:
2147483647 = 01111111 11111111 11111111 11111111(第一个是符号位0,其他的全部为1,就是正数的最大值)
那么此时如果加1,会进位成:
10000000 00000000 00000000 00000000
各位想一想,符号位为1,那么此时表示的不就是一个负数了吗?我们回想一下负数的补码表示规则,瞬间就能明白了,这不就是补码形式下的最小值了吗?
所以说最后的结果就是int类型的最小值:-2147483648,是不是感觉了解底层原理会更容易理解这是为什么。
4. 整数类型
-
byte 字节型 (8个bit,也就是1个字节)范围:-128~+127
-
short 短整形(16个bit,也就是2个字节)范围:-32768~+32767
-
int 整形(32个bit,也就是4个字节)最常用的类型:-2147483648 ~ +2147483647
-
long 长整形(64个bit,也就是8个字节)范围:-9223372036854775808 ~ +9223372036854775807
- long类型要特别注意:数字后面加L / l。
public static void main(String[] args) { long a = 922337203685477580L; }
- 对长数字可以用下划线分割每一位:
public static void main(String[] args) { int a = 1_000_000; }
- 也可以以八进制或者十六进制表示一个常量值
public static void main(String[] args) { System.out.println(0xA); //十六进制10 System.out.println(012); //八进制10 }
5. 浮点类型
给常量后面添加大写或小写的F来表示这是一个float类型的常量值:
public static void main(String[] args) {
float f = 9.9F; //这样就可以正常编译通过了
}
6.布尔类型
public static void main(String[] args) {
boolean b = true; //值只能是true或false
System.out.println(b);
}
7. 隐式类型转换规则:
byte→short(char)→int→long→float→double
8. 加分可以实现字符串的拼接
public static void main(String[] args) {
String str = "伞兵" + "lbw"; //我们可以使用加号来拼接两个字符串
System.out.println(str);
}
还可以和基础类型拼接
public static void main(String[] args) {
String str = "伞兵" + true + 1.5 + 'A';
System.out.println(str);
}
9. 强制类型转换
public static void main(String[] args) {
int a = 10;
short b = (short) a; //在括号中填写上强制转换的类型,就可以强制转换到对应的类型了
}
10. 位运算
位运算符: & | ^ ~
11. 逻辑运算符
&& 与运算,要求两边同时为true才能返回true
|| 或运算,要求两边至少要有一个为true才能返回true
! 非运算,一般放在表达式最前面,表达式用括号扩起来,表示对表达式的结果进行反转
12. 代码块与作用域
变量的使用范围,仅限于其定义时所处的代码块,一旦超出对应的代码块区域,那么就相当于没有这个变量了。
13. switch
switch (目标) { //我们需要传入一个目标,比如变量,或是计算表达式等
case 匹配值: //如果目标的值等于我们这里给定的匹配值,那么就执行case后面的代码
代码...
break; //代码执行结束后需要使用break来结束,否则会溜到下一个case继续执行代码
}
public static void main(String[] args) {
char c = 'A';
switch (c) { //这里目标就是变量c
case 'A': //分别指定ABC三个匹配值,并且执行不同的代码
System.out.println("去尖子班!准备冲刺985大学!");
break; //执行完之后一定记得break,否则会继续向下执行下一个case中的代码
case 'B':
System.out.println("去平行班!准备冲刺一本!");
break;
case 'C':
System.out.println("去职高深造。");
break;
}
}
default可以用来处理其他情况:
public static void main(String[] args) {
char c = 'A';
switch (c) {
case 'A':
System.out.println("去尖子班!");
break;
case 'B':
System.out.println("去平行班!");
break;
case 'C':
System.out.println("去差生班!");
break;
default: //其他情况一律就是下面的代码了
System.out.println("去读职高,分流");
}
}