目录
背景
java
服务器端开发 B/S
Tomcat MySQL
Linux Window MacOS
历史
1993 – Oak
1995 – 面向市场 – 跨平台
组成
JDK – Java Development Kit 开发工具
工具:java、javac、javadoc…
包含JRE
JRE – Java Runtime Environment 运行环境
工具:java
类库:Library + 写好的代码
包含JVM
JVM – Java Virtual Machine 虚拟机
不能独立安装
JDK文件夹组成
bin -> java的开发工具 java\javac\javadoc\jar…
conf -> 配置文件
lib -> jar包(字节码文件打包而成)
终端调试
- 先在所在目录查找命令
- 去环境变量指定目录中寻找
- javac helloWorld.java->生成.class字节码文件
- java helloWorld->执行
环境变量
解决方案:
1.进入到工具所在目录 – 治标不治本 – 不推荐
cd -> 切换目录
d: -> 切换盘符
javac -> 编译工具
2.修改环境变量
我的电脑 -> 右键 -> 属性 -> 高级 -> 环境变量
path %JAVA_HOME%\bin
新建变量:JAVA_HOME
值:jdk安装目录 jdk9.0.4
变量
定义
jvm内存中分配了一块空间,存储数据
命名规则
1.只能出现:英文 + 数字 + _ + $
2.不能以数字开头
3.变量名:可读性好、首字母小写、第二个单词开始首字母大写
public和class
public: 修饰词 – 修饰的是class
class: 类 – 文件
- 一个文件中可以有多个类,但最多只能有一个public修饰的类
- public修饰的这个类,名字必须和文件名相同
数据类型
只有2种数据类型:基本数据类型 + 引用类型
引用类型:数组、类、接口
基本数据类型
8种
整型:byte、short、int、long
浮点型:float、double
字符型:char
布尔:boolean
基本单位:1 字节 = 8位
char字符型
char c = 'a';
c = '中';
c = '\u4e2d'; // Unicode编码 - 1个字符=2个字节 防止乱码
System.out.println(c);
char c1 = 48; // ASCII码 'A'=65 'a'=97 '0'=48
System.out.println(c1);
c1 = 0; // 空白字符
System.out.println(c1);
System.out.println("\u4e2d\u4e2d\u4e2d\u4e2d");
中
0
中中中中
float、double浮点型
double不能用==,精度缺失
double d = 5.0 - 4.9;
// 结果d=0.09999999999999964
d = 3.0 - 2.9;
// d=0.10000000000000009
d = 3.0 - 2.5;
//d=0.5
补码
java虚拟机中存储基本数据类型的格式:二进制补码
2 4 8 16 32 64 128 256 512 1024
20
0 001 0100
-20
原码:1 001 0100
反码:1 110 1011
补码:1 110 1100 – JVM
取值范围
byte:1个字节 = 8位 范围:-128~127
0 111 1111 -> 127
补:1 111 1111
反:1 111 1110
原:1 000 0001 -> -1
1 111 1110
1 111 1101
1 000 0010 -> -2
最小值:
1 000 0000
1 111 1111
1 1 000 0000 -> -128
short:2个字节 = 16位 范围:-2^15 ~ 2^15-1
int: 4个字节 = 32位 范围:-2^31 ~ 2^31-1
long: 8个字节 = 64位 范围:-2^63 ~ 2^63-1
(通常用来表示时间)
char: 2个字节 = 16位
1111 1111 1111 1111 -> 0 ~ 2^16-1 = 65535
‘\u0000’ ~ ‘\uffff’
科学计数法:
float:32位
1位符号位 8位 指数位 23位 尾数位
double:64位
1位符号位 11位 指数位 52位 尾数位
客观存在:精度缺失问题, 不能判断两个浮点数是否相等
boolean: true false 1个字节8位
直接量、字面量
int i = 2100000000;
// 整数的直接量、字面量默认类型都是int
long l = 21000000000l;
// 想要表示long类型,需要追加 l/L
float f = 3.14; // 编译错误
// 小数字面量默认都是double类型
// 如果要给float赋值,需要追加 f/F
float f = 3.14f;
自动类型转换
byte -> short -> char->int-> long -> float
只能小范围转换到大范围
byte b = 10;
short s = 128;
s = b; // 小范围赋值给大范围,允许 - 自动类型转换
b = (byte)s; // 大范围赋值给小范围,不允许,除非强制类型转换
运算符
算术运算符
加、减、乘、/、%(取模)、++、–
++ i 先运算,再使用
i ++ 先使用,再运算
运算符左右两边类型是统一的
double a = 1 + 3.14;//int+double=double
System.out.println(a);//a=4.140000000000001
int i = 5 / 2; // 整除
System.out.println(i); // 2
double h = 5 / 2;
System.out.println(h);//2.0
double d = 5 / 2.0;
System.out.println(d); // 2.5
System.out.println(i++); // 2
System.out.println(i); // 3
赋值运算符
= += -= *= /=
a += 2; 不同于 a = a+2
byte b = 10;
b = b + 1; // 编译错误,byte=int
b++;// 不会改变类型
b += 1; // 不会改变类型
比较运算符
> < >= <= == !=
结果:boolean类型
位运算符 与& 或 | 异或^
与& 或 | 异或^
二进制计算 2 ^ 4
0000 0010
0000 0100
0000 0110 = 6
抑或:相同是0,不同是1
int a = 2 & 4;
System.out.println(a);//0
System.out.println(2 ^ 4);//6
逻辑运算符&& & || |
两边都是boolean值,结果也是boolean值
- &&: 两边都是true,结果才是true
||: 有一个是true,结果就是true - && 比 & 多了一个“短路”
短路:通过第一个表达式已经能确定整个结果,第二个表达式就跳过了
int a = 10;
int b = 20;
System.out.println(a++ > 10 && b-- < 20); // false
System.out.println(a); // 11
System.out.println(b); // &:19 &&:20
//&就算第一个表达式不成立还继续执行了第二个表达式,而&&直接跳过了
位移运算符:>> << >>>
>>>:无符号右移,先转换成补码,永远补0
>>:补位是符号位
int a = -4;
System.out.println(a >> 1); // -2
System.out.println(a << 1); // -8
System.out.println(a >>> 1); // 2147483646
三目运算符:?:
表达式1[boolean值] ? 值1 : 值2
可以用来做判断
int a = 18;
double d = a <= 20 ? 3.14 : 0;
System.out.println(d);//true取值1,false取值2