思维导图
1 概述与环境搭建
1.1 Java发展历史
创始公司:Sun Microsystems
发布时间:1995年
创始人:詹姆斯·高斯林
Java前身:oak
- 1998年发布JDK1.2 : J2SE、J2EE、J2ME
- 2004年发布JDK1.5:Java SE、Java EE、Java ME
- 2009年被Oracle收购
- 2014年由Oracle发布Java 8.0
- …
1.2 java语言的特点
面向对象:贴近人类思维模式,模拟现实世界,解决现实问题
简单性:自动内存管理机制、不易造成内存溢出,简化流程处理、语义清晰
跨平台:跨操作系统,服务器等
开源:开放源代码
2 Java运行机制
2.1 计算机的执行机制
编译执行
将源文件编译成平台相关的机器码文件,一次编译,多次运行
执行效率高,不可跨平台
解释执行
将源文件交给不同平台独有的解释器。
执行效率低,可以跨平台。
Java的执行机制
先编译,再解释
将源文件编译成字节码文件(.class),再将字节码文件进行解释执行
Java的设计理念:一次编译,到处运行
2.2 环境
名词解释
JVM(Java Virtual Machine):Java虚拟机,使用软件在不同操作系统中,模拟相同的环境
JRE(Java Runtime Environment):Java运行环境,包含JVM和解释器,完整的Java运行环境
JDK(Java Development Kit):Java开发环境,包含JRE + 类库 + 开发工具包(编译器+调试器)
JDK目录
bin:binary 二进制文件
db:数据库
include:头文件
jre:Java运行环境
lib:类库
配置环境变量
右键我的电脑 --> 属性 --> 高级系统设置 --> 环境变量
1、在系统变量中新建:Java_Home
变量值:JDK安装路径
2、在系统变量中新建:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
3、找到:Path
在后面添加:%Java_Home%\bin;%Java_Home%\jre\bin;
2.3 常用DOS命令
windows + R # 打开命令提示符
d: # 切换盘符为d盘
dir # 显示当前目录下所有文件
dir /o # 分类显示
dir /w # 宽屏显示
dir /p # 分页显示
dir /s # 显示所有文件(包括子目录下的文件)
cd.. # 回到上级目录
cd \ # 切换到根目录
cd 目录名 # 切换目录
cls # 清空屏幕
del my.txt # 删除文件
del 目录 # 删除此目录下的所有文件(不删除目录)
rd 目录 # 删除目录(只能删除空目录)
rd /s 非空目录 # 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
rd /q # 安静模式,带 /S 删除目录树时不要求确认
md 目录 # 新建目录 (可以创建多级,用\分割)
copy robot\zbx\bird.png robot\picture # 复制文件
xcopy ... /e # 复制目录下的文件及子目录
3 第一个Java程序
3.1 记事本编写Java程序
在c盘的myjava目录下创建一个文件 Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
打开命令提示符,进入此文件所在的目录,执行如下命令
先编译:javac Hello.java
再执行:java Hello
3.2 字节码文件
查看字节码文件(.class)
javap -c Hello // 查看概要信息
// 虚拟机指令
C:\myjava>javap -c Hello
Compiled from "Hello.java"
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
javap -v Hello // 显示更详细的信息
字节码文件标示
EditPlus工具打开字节码文件,使用十六进制查看器
前面四个字节 CA FE BA BE (魔术 字节码文件标示)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipQ7Hvmc-1595379591611)(C:\A-Importance Data For My Study\md随手笔记\图像存储位置\image-20200721115030583.png)]
3.3 类 class
同一个文件可以定义多个类,但只能有一个public 类
public 修饰的类称为公开类,要求类名必须与文件名相同
编译后,每个类都会生成一个字节码文件
一个类中,只能有一个主方法,每个类都可以生成自己的主方法
3.4 包 package
作用:类似于文件夹,用于管理字节码文件
编写代码
package com.robot.base;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
编译运行
javac -d . Hello.java // .代表当前目录 -d代表带包编译
java com.robot.base.Hello
3.5 命名规范
包名
包名全部小写,只可以使用特殊字符“.”,但不能用“.”开头或结尾
采用域名倒置的规则:www.baidu.com —> com.baidu.xxx
例如:cn.com.company.department.group.project. module.XxxClass
标识符命名
可以由字母、数字、下划线、$组成,但不能以数字开头
不能与标识符,保留字重名
类名
大驼峰(一个单词或多个单词组成,每个单词的首字母大写)
函数名、变量名
小驼峰(一个单词或多个单词组成,第一个单词的首字母小写,其余拼接单词的首字母大写)
常量名
常量全大写,多个单词之间用下划线连接
3.6 注释
// 单行注释
/*
* 多行注释
*/
/**
* 文档注释
*/
4 Java变量
变量:计算机内存中的一块存储空间,是存储数据的基本单元
变量的组成:数据类型 变量名 = 值
4.1 变量的定义
int count; // 先声明
count = 125; // 再赋值
String name = "robot"; // 声明并赋值
int a = 12, b = 25; // 多个同类型变量的声明与赋值
4.2 面试题
// 不使用第三个变量交换两个数字
public void exchange() {
int a = 12;
int b = 25;
// 第一种方法,加减法
a = a + b;
b = a - b;
a = a - b;
System.out.println("a:" + a + " b:" + b);
// 第二种方法,异或
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a:" + a + " b:" + b);
}
异或分析
a = 2 b = 3
0010
0011
-----
0001 a = 1
0001
0011
-----
0010 b = 2
0001
0010
-----
0011 a = 3
a = 3 b = 2
5 Java数据类型
5.1 Java数据类型包括
-
基本数据类型:整数、小数、布尔、字符
-
引用数据类型:字符串、数组、对象
基本数据类型 | 引用数据类型 | 大小(字节) | 范围 |
---|---|---|---|
byte | Byte | 1 | -2^7 ~ 2^7-1 |
short | Short | 2 | -2^15 ~ 2^15-1 |
int | Integer | 4 | -2^31 ~ 2^31-1 |
long | Long | 8 | -2^63 ~ 2^63-1 |
float | Float | 4 | … |
double | Double | 8 | |
char | Character | 2 | |
boolean | Boolean | 1 |
面试题
double d = (1.4 - 0.5) / 0.9;
System.out.println(d);
// 结果
// 0.9999999999999999
// 原因
// 1.4和0.9在计算机中不能转换为精确的二进制数
System.out.println(1.0/0);
// 结果: Infinity
// 原因: 整数不能除零,会出现除零异常
// 浮点数除零,会显示无穷
5.2 转义字符
\' // 单引号
\n // 换行
\r // 回车,光标移到行首
\t // 制表符
5.3 类型转换
自动类型转换:目标类型 > 源类型
- byte —> short —> int —> long —> float —> double
- char —> int
byte a = 12;
int b = 25;
b = a; // b > a 所以可以自动转换
强制类型转换:目标类型 < 源类型
float c = 3.14f;
double e = 5.20;
c = (float) e; // c < e 需要强转
5.4 面试题
byte,short,char三者在计算时会转换成 int 类型。
byte b1 = 10;
byte b2 = 20;
byte b3 = (byte) (b1 + b2);
int整型常量和字符常量在合理范围内可以直接赋值给byte、 short、 int、char
6 原码、反码、补码
负数在计算机中使用补码存储
-128 = 1000 0000 # 特例
原码
最高位为符号位,0代表正数,1代表负数,其它位为改数字绝对值的二进制数
0111 1111 # 127的原码
1111 1111 # -127的原码
反码
正数:正数的反码与原码一致
负数:对原码 按位取反,但符号位不变
0111 1111 # 127的反码
1000 0000 # -127的反码
补码
正数:正数的补码与原码一致
负数:对原码 按位取反,末尾加一,但符号位不变
0111 1111 # 127的补码
1000 0001 # -127的补码
7 进制转换
二进制
逢二进一,例如:10110
十进制
逢十进一,例如:12
八进制
逢八进一,例如:12O
十六进制
逢十六进一,例如:2AH,0x25
基本数字:0-9,A-F
二进转十进制
从左到右用二进制的每个数去乘以2的权次幂相加
小数转换:小数点后面从-1次幂开始
二进制转八进制
三位转一位
110 101
6 5
结果:65O
二进制转十六进制
四位转一位(因为四位二进制表示的范围和十六进制一位表示的范围一样)
1011 0101
B 5
结果:B5H
十进制转二进制
除2取余,逆序排列
小数转换:小数点后面乘2取整
例如:2.5 = 10.1 2.8 = 10.11001…
8 Java运算符
8.1 运算符
算术运算符
+ - * / % ++ --
赋值运算符
= += -= *= /= %=
关系运算符
> < >= <= == !=
逻辑运算符
&& || !
三元运算符
? :
a==b ? 1 : 0 // 如果a=b,则取值1,否则取值0
8.2 自动类型提升
进行算数运算时:
- 两个操作数有一个为double,计算结果提升为double
- 如果操作数中没有double,有一个为float,计算结果提升为float
- 如果操作数中没有float,有一个为long,计算结果提升为long
- 如果操作数中没有long,有一一个为int,计算结果提升为int
- 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int
8.3 练习题
一个四位数的数字,求各个位上数字的和
public void demo02() {
int card = 4567;
int ge = card % 10;
int shi = card / 10 % 10;
int bai = card / 100 % 10;
int qian = card / 1000;
System.out.println(ge + shi + bai + qian);
}
8.4 面试题
int k = 20;
for (int i = 0 ; i < 10 ; i++) {
k = k++;
}
System.out.println(k);
// 结果: 20
//
// k = k++
// 1. (k++) = 20
// 2. k = 21
// 3. k = (k++) = 20
// 最后赋值给k的是(k++)不是k