Java笔记1——Java概述与基础
一、Java概述
1.JDK、JRE、JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些?
JDK(Java开发工具) = JRE +Java的开发工具(包括javac.exe,java.exe,javadoc.exe)
JRE(Java运行时环境)= JVM + Java核心类库
2.为什么要配置path环境变量?如何配置?
path环境变量是windows操作系统执行命令时索要搜寻的路径。
通过配置path环境变量,我们可以使某个程序,比如javac.exe,在任意目录下都可以运行,而不用跑到javac存在的目录下进行dos命令。
【配置方法】
JAVA_HOME = bin的上一层目录
path = %JAVA_HOME%\bin
二、Java 基础
2.1 关键字和保留字
- 关键字(Keyword):被Java语言赋予了特殊的含义,被用做专门用途的字符串(都是小写)。比如class、interface、int等。
- 保留字(reserved word):现有Java版本尚未使用,以后可能作为关键字使用。比如goto。
2.2 标识符(Identifier)
-
标识符:Java对各种变量、方法和类等要素命名时使用的字符序列成为标识符。(凡是自己可以起名字的地方都叫标识符)
-
定义合法标识符规则:
- 由26个英文字母大小写,0-9,_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字
- 区分大小写,长度不限制
- 不能包含空格
-
Java中的名称命名规范:
- 包名:多单词组成时所有字母都小写:xxxyyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
- 常量名:所有字母都大写,多单词组成时,用下划线链接:XXX_YYY_ZZZ
2.3 变量与数据类型
Java中每个变量必须先声明,后使用。如下格式
数据类型 变量名 = 变量值;
变量按照数据类型进行分类:
数
据
类
型
{
基
本
数
据
类
型
{
数
值
型
{
整
数
类
型
(
b
y
t
e
,
s
h
o
r
t
,
i
n
t
,
l
o
n
g
)
浮
点
类
型
(
f
l
o
a
t
,
d
o
u
b
l
e
)
字
符
型
(
c
h
a
r
)
布
尔
型
(
b
o
o
l
e
a
n
)
引
用
数
据
类
型
{
类
(
c
l
a
s
s
)
接
口
(
i
n
t
e
r
f
a
c
e
)
数
组
(
[
]
)
数据类型\begin{cases}基本数据类型\begin{cases}数值型\begin{cases} 整数类型(byte,short,int,long)\\浮点类型(float,double)\end{cases} \\ 字符型(char) \\ 布尔型(boolean)\end{cases} \\ 引用数据类型 \begin{cases}类(class)\\ 接口(interface) \\ 数组([])\end{cases}\end{cases}
数据类型⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧基本数据类型⎩⎪⎪⎪⎨⎪⎪⎪⎧数值型{整数类型(byte,short,int,long)浮点类型(float,double)字符型(char)布尔型(boolean)引用数据类型⎩⎪⎨⎪⎧类(class)接口(interface)数组([])
| 数据类型 | 大小 | 范围/说明 |
|---|---|---|
| byte | 1个字节 | -128~127 |
| short | 2个字节 | − 2 15 -2^{15} −215 ~ 2 15 − 1 2^{15}-1 215−1 |
| int | 4个字节 | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 |
| long | 8个字节 | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1,long需要以l或L结尾,比如long l1 = 100L; |
| 单精度float | 4个字节 | -3.403E38 ~ 3.403E38,float需要以f或F结尾,比如float f1 = 1.1F; |
| 双精度double | 8个字节 | -1.798E308~1.798E308 |
| char | 2个字节 | |
| boolean | 不是true就是false |
float之所以比int表示范围大,是因为他的空间被分为两部分,一部分是具体的数,一部分是幂。但是精度比较小。
2.3.1 自动类型转换
数值型数据类型按照取值范围排序:byte、short、int、long、float、double。当容量小的数据类型的变量与容量大的数据类型变量做运算时,结果自动提升为容量大的数据类型。
特别的:当byte、char、short三种进行运算时,结果为int。(包括自身运算,比如byte和byte)
2.3.2 强制类型转换
强制类型转换是自动类型转换的逆运算。
使用强转符,进行截断操作,可能会导致损失精度,如下所示:
double d1 = 12.9;
int i1 = (int)d1;//截断操作
System.out.println(i1);//输出12
//没有精度损失
long l1=123;
short s1 = (short)l1
2.3.3 String类型
- String属于引用数据类型,不是基本数据类型。
- String可以和8种基本数据类型进行连接运算。
int number = 1001;
String numberStr = "学号";
String info = numberStr + number;//+:连接运算
System.out.println(info);//输出 学号1001
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c+num+str);//107hello
System.out.println(c+str+num);//ahello10
System.out.println(c+(num+str));//a10hello
System.out.println((c+num)+str);//107hello
System.out.println(str+num+C);//hello10a
System.out.println("* *");//输出* *
System.out.println('*'+'\t'+'*');//输出93,因为char类型作运算结果为int
2.3.4 二进制
计算机底层都以补码存储数据。
二进制第一位为符号位,1为负数,0为正数。
正数原码、反码、补码都相同。
反码为原码除符号位外其余位取反。
补码为反码加一。
2.4 运算符
2.4.1 算术运算符
| 运算符 | 运算 | 说明 |
|---|---|---|
| + | 正号 | |
| - | 负号 | |
| + | 加号 | |
| - | 减号 | |
| * | 乘 | |
| / | 除 | |
| % | 取余 | |
| ++ | 自增 | 不会改变自身数据类型 |
| – | 自减 | 不会改变自身数据类型 |
| + | 字符串连接 | String a = “a”;String b = “b”;那么a+b的结果就为"ab” |
2.4.2 赋值运算符
| 运算符 | 说明 |
|---|---|
| = | 当“=”两侧数据类型不一致,可以使用自动类型转换或强制类型转换原则进行处理 |
| += | a+=b 与 a=a+b相同,但是不会改变数据类型,比如short s = 2;s+=2;是可以的,s=s+2是不行的(因为会被转成int类型)下面的操作同理 |
| -= | a-=b 与 a=a-b相同 |
| *= | a*=b 与a=a*b相同 |
| /= | a/=b 与 a=a/b相同 |
| %= | a%=b 与 a=a%b相同 |
2.4.3 比较运算符
| 运算符 | 说明 | 范例 | 结果 |
|---|---|---|---|
| == | 相等于 | 4==3 | false |
| != | 不等于 | 4!=3 | true |
| < | 小于 | 4<3 | false |
| > | 大于 | 4>3 | true |
| <= | 小于等于 | 4<=3 | false |
| >= | 大于等于 | 4>=3 | true |
| instanceof | 检测是否是类的对象 | “Hello” instanceof String | true |
2.4.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 | true | true | true |
| false | false | false | false | false | false | true | false |
- 逻辑与& 和 短路与&&的区别
运算结果没区别
但是短路与若发现一个变量为false,就不进行之后的计算,如下所示:
int num1 = 1;
int num2 = 1;
boolean b = false;
if(b&(num1++>0)){
....
}
else{...}
if(b&&(num2++>0)){
...
}
else{...}
System.out.println(num1);//2
System.out.println(num2);//1
- 逻辑或| 和 短路或||的区别
运算结果没区别
但是短路或若发现一个变量为true,就不进行之后的计算。 - 工作中推荐使用短路与和短路或。
2.4.5 位运算符
| 位运算符 | 运算 | 范例 |
|---|---|---|
| << | 左移 | 3<<2 = 12 --> 3*2*2 = 12 |
| >> | 右移 | 3>>1 = 1 --> 3/2 = 1 |
| >>> | 无符号右移 | 3>>>1 = 1 -->3/2 =1 |
| & | 与运算 | 6&3 = 2 |
| | | 或运算 | 6|3 = 7 |
| ^ | 异或运算 | 6^3 = 5 |
| ~ | 取反运算 | ~6 = -7 |
- 位运算符操作的都是整形的数据。
2.4.6 三元运算符
- 结构为:(条件表达式)?表达式1:表达式2;
- 如果条件表达式为true,则执行表达式1,否则执行表达式2。
- 表达式1和表达式2要是相同类型。
int m = 1,n = 2;
System.out.println(m>n?m:n);//输出2
2.5 程序流程控制
-
1.if-else if -else(条件判断结构)
-
2.switch-case(执行效率比if-else高)
-
3.for循环
for (①;②;④){ ③; } int num = 1; for(System.out.println('a');num<=3;System.out.println("c"),num++){ System.out.println("b"); }//输出结果abcbcbc执行过程:①➡②➡③➡④➡②➡③➡④➡②➡③➡④➡…
-
4.while循环
-
5.do-while循环
2.6 数组
- 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
- 数组是引用类型变量。
- 创建数组对象会在内存中开辟一整块连续的空间。
- 数组的长度一旦确定,就不能修改。
2.6.1 数组操作
//1.数组初始化
int[] arr;//声明
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
arr = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
//2.如何调用数组的指定位置的元素
names[0] = "name";
//3.如何获取数组的长度
//属性:length
System.out.println(names.length);//输出5
2.6.2 数组元素的默认初始化值
| 类型 | 初始值 |
|---|---|
| 整型 | 0 |
| 浮点型 | 0.0 |
| char | 0或’\u0000’,非’0’ |
| boolean | false |
| 引用数据类型 | null |
2.6.3 数组的内存解析
JVM内存分配可以分为
- 栈(stack):存放局部变量。
- 堆(heap):存放对象、数组。
- 方法区:内有常量池和静态域
数组声明初始化的时候。
- 首先会在堆中开辟一个数组长度 × \times × 类型大小的空间,存放数据。
- 接着数组变量(数组名)会存在栈中,并有一个指向他存放在堆中数据的首地址。
- 使用引用计数算法,判断堆中的对象是否仍在使用,如果计数为0,会在之后进行垃圾回收。
2.6.4 数组中常见的异常
- 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
- 空指针异常:NullPointerException