目录
搭建Java环境
一、安装jdk(java开发工具包)
二、设置环境变量
不想每次都从当前目录中找该命令,有两种方法
① 直接在path中添加这个地址 C:\Program Files\Java\jdk1.8.0_211\bin
② 先创建一个自定义的环境变量 名为JAVA_HOME (java的家目录 ),值为C:\Program Files\Java\jdk1.8.0_211,在path中添加 %JAVA_HOME%\bin
(%变量名% 表示取值的意思,取值后拼接上 \bin) --> C:\Program Files\Java\jdk1.8.0_211\bin
如果以后需要更换java的版本,只需要更改JAVA_HOME即可,不需要更改环境变量,还有一些软件需要通过JAVA_HOME这个变量找到jdk的家目录
修改后环境变量之后,需要重启终端环境变量才能生效。
三、安装idea(Java开发工具)
双击exe安装,安装位置换成D盘
jihuo
选择不需要导入配置
页面风格随意,黑色或白色风格
安装插件,file右击选择Settings,
创建一个新的工程,第一种普通的java工程,学习语法期间都是创建普通的java工程
选择自己的jdk,ideal是用来编写代码的,jdk用来编译和执行代码的,否则代码无法运行
工程代码存放目录C:\Users\86150\IdeaProjects,默认在当前用户的家目录中创建一个IdeaProjects目录,以后创建的所有工程都在这个目录中
Java底层知识
一、JDK、JRE、JVM三者之间的关系
二、Java程序运行流程
① 源代码文件.java经过javac编译器编译成字节码文件.class,它们都存储在磁盘当中,由于Java程序是由CPU来运行的,但CPU不能直接与磁盘进行交互,CPU可以直接与内存进行交互,所以需要在内存中申请一定的空间,将文件从磁盘加载到内存中去
② 通过JVM中的类加载子系统,通过加载、链接、初始化等操作,
③ 将字节码文件加载到数据区中
④ 方法区存放mian()、字节码文件,栈区存放执行流程,堆区进行数据存储,从堆区—》栈区—》方法区依次执行释放
⑤ 通过执行引擎的解释器和JIT将字节码文件翻译成机器码
⑥ 机器码反馈给底层机器,程序完毕后退出虚拟机
三、JVM实现跨平台的原理
一次编译,到处运行
提供不同版本的JVM,通过JVM来执行Java程序,并同时通过不同版本的JVM将代码翻译成机器码给对应的操作系统识别
三、源代码文件与字节码文件
idea自带工具反编译的class文件
在idea 打开 跟源代码 差不多
反编译成十六进制文件
安装BinEd、jclasslib插件
选择字节码文件,右击选择Open As Binary
必须在HEX十六进制情况下,才可以看到CAFEBABE
魔数是编译器自动加上去的,CAFEBABE是字节码文件的身份标识,
有CAFEBABE才是合法的字节码文件,才能被JVM虚拟机运行
反编译成汇编指令
cmd是dos系统,是操作系统自带的命令行终端
Idea自带的内置命令行终端,相当于在终端中打开,cmd和Idea自带的内置命令行终端不是一个东西,但是它们作用相同
javap 反编译 字节码 - > 源代码
javap -v -p 字节码 - > 汇编指令
javap -v -p 字节码文件 > 文件名.txt
将字节码转变成汇编指令写入到文件名.txt中去,方便程序员查看
最终运行的是字节码文件,而不是源代码文件,运行环境默认与编译环境一样,运行环境必须大于或等于编译的版本才能运行
Java基础知识
一、命名规范
类文件是JAVA代码的最小组织单元,文件名后缀名是.java,命名规范是大驼峰 (所有单词的首字母全部大写) eg:HelloWorld.java
类文件不能重名, 但可以使用包来定义多个命名空间,包本质上就是文件夹
包名命名规范
1. 包名全部小写字母
2. 包名的格式为 公司类型.公司名.项目名.模块名
包名中的 . 对应的是一个目录层级
常见的公司类型:
com 国际型商业公司
cn 国内商业公司
edu 教育机构
org 非营利性民间组织
gov 政府机构
二、基本操作
1、直接点击代码旁的绿色三角符号
2、右击文件
3、右击空白处,选择run运行
4、文件重命名
三、字符集
分类
ASCII 双字节编码 美国人编码,包含128个字符
ISO-8859-1 双字节编码 欧洲的编码,包含256个字符
GB2312 国标码 双字节编码 GB2312标准共收录6763个汉字
GBK 国标码 双字节编码 共收入21886个汉字和图形符号
Unicode 万国码,包含了世界上所有的语言和符号
ASCII码
32是空格
33~47为常用的标点符号
48~57为0到9十个阿拉伯数字
58~64为常用的标点符号
65~90为26个大写英文字母
91~96为常用的标点符号
97~122为26个小写英文字母
123~126为常用的标点符号
127是删除
四、4类8种基本(简单)数据类型
注意:
1、java的数据类型与mysql数据库的数据类型很相似,但不是一回事
2、mysql的数据类型是用来定义表中的字段的数据类型,表在磁盘文件中(永久性,持久性,程序退出,系统关机断电以后文件不会丢失,除非手动删除)
java的数据类型是用来定义变量的数据类型,而变量在内存中(瞬时性,暂时性,程序退出,系统关机断电后内存中所有的数据全部自动擦除)
3、内存的读写速度要远远高于磁盘
CPU 逻辑运算处理器 CPU会将运算结果临时存入内存中,不需要存入磁盘,会浪费存储空间,磁盘读写慢
GPU 图形处理器
SSD 固态硬盘 速度快
HDD 机械硬盘
4类8种基本(简单)数据类型
package edu.tongda.demo1;
//我们在学习语法写测试代码的时候,包名会以demo1作为延伸 包名 小写
//类名也是以demo1作为延伸 类名 首字母大写
public class Demo1 {
//psvm 快速出现一个打印的入口
//这是一个java程序的运行入口,若没有则该类文件不能够被run执行的
public static void main(String[] args) {
// 测试8种基本数据类型
// 使用类型关键字向内存申请内存空间
// 语法:数据类型 变量名 = 值
// 数据类型是你想要申请的内存空间的类型,数据类型有8个
// 变量名是指向你申请到的内存空间的地址的一个代号
// 值是存入到那块内存空间中的数据
//超过范围会报错 不能编译 当然不能被运行
//当程序中有红色波浪号时,代表程序中有错误,不能被运行
byte a = -128; // -128 ~ 127
short b = 32767; // -32768 ~ 32767
int c = 100000000;
long d = 100000000000000L; // long类型的数据需要加 L 标识
float e = 9.5F; // long类型的数据需要加 F 标识
double f = 9349.67645;
char g = 'x'; // char类型可以存储任意一个字符,用单引号,注意只能一个字符
boolean h =false; //boolean类型只能存储true和false这2个值
System.out.println(a); //sout 快速在控制台打印
System.out.println(b); //ctrl+D 快速复制一行
System.out.println(c); //ctrl+X 快速删除一行
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
System.out.println(h);
}
}
五、运算符
1、算数运算符
+ - * / %
public class Demo2 {
public static void main(String[] args) {
//打印6379的千位、百位、十位和个位
int num = 6379;
int a = num / 1000;
int b = num / 100 % 10;
int c = num / 10 % 10;
int d =num % 10;
System.out.println(a); // 6
System.out.println(b); // 3
System.out.println(c); // 7
System.out.println(d); // 9
}
}
2、比较运算符
> < >= <= == !=
public class Demo3 {
public static void main(String[] args) {
int a = 50;
int b = 51;
// 比较运算符有6种,运算结果只有2个 true false
// 运算结果为布尔值,true/false,其数据类型是 boolean
System.out.println(a > b); //false
System.out.println(a < b); //true
System.out.println(a >= b); //false
System.out.println(a <= b); //true
System.out.println(a == b); //false
System.out.println(a != b); //true
}
}
3、逻辑运算符
短路 不短路
与 && & 发音和含义与AND一样
或 || | 发音和含义与OR一样
非 !
短路性能高于不短路
public class Demo4 {
public static void main(String[] args) {
System.out.println();
int a = 20;
int b = 21;
int c = 30;
int d = 60;
//逻辑运算符最终运算结果也是布尔值
//测试与运算符 打印运算结果
System.out.println(a < b && c % 3 == 0); //true
System.out.println(a > b && c % 3 == 0); //false
System.out.println(a < b || c % 3 == 0); //true
System.out.println(a > b || c % 3 == 0); //true
System.out.println(a > b && c % 3 == 0); //false
System.out.println(a > b && c % 3 == 0); //false
System.out.println(!(c % 3 == 0)); //false
System.out.println(!(a > b && c % 3 == 0)); //true
}
}
4. 自增和自减运算符
++
–
public class Demo5 {
public static void main(String[] args) {
// ++ 自增1
// -- 自减1
//一条语句申请多个内存空间,内存的数据类型必须一样才可以这样写,否则应写成多条指令
int a = 10, b = 20;
// ++ 可以出现在变量名前面 ++a/--a 或后面 a++/a--
// ++/--在前面:先++ 或 -- , 再执行其他运算
// ++/--在后面:先执行其他运算,在执行 ++ 或 --
System.out.println(a);
System.out.println(a++ == 11); // false
System.out.println(a); // 11
System.out.println(--a == 11); //false
System.out.println(a); // 10
}
}
public class Demo6 {
public static void main(String[] args) {
int a = 10, b= 11, c=12;
//短路与不短路的区别
//System.out.println(a > b && ++b == c);
//短路与 false 10 11 12
//System.out.println(a > b & ++b == c);
//不短路与 false 10 12 12
//System.out.println(a ++ == b || c-- == b);
// 短路或 false 11 11 11
//System.out.println(a ++ == b | c-- == b);
// 不短路或 false 11 11 11
System.out.println(++a == b || c-- == b);
// 短路或 true 11 11 12
//System.out.println(++a == b | c-- == b);
// 不短路或 true 11 11 11
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
5、赋值运算符
= += -= *= /= %=
public class Demo7 {
public static void main(String[] args) {
// = += -= *= /= %=
//注:1个 = 是赋值,2个 == 是比较是否相等
//什么是赋值:就是把右边的值存入到左边的变量所指向的内存空间的过程
//右边可以知识直接量、变量、运算表达式
int a = 10;
int b = a;
int c = a +b;
a += 10;
a -= 5;
a *= 3;
a /= 3;
a %= 5;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
6、7种位运算符(自己写代码用不到,官方源码或面试可能会问到,与二进制相关)
& 按位与
| 按位或
~ 按位非
^ 按位异或
<< 左移
.>> 右移
.>>> 无符号右移
public class Demo8 {
public static void main(String[] args) {
// 向内存申请一块4个字节(一个字节是8个bit)的存储空间
// 变量a指向这块内存的指针
//8421
int a = 5; //00000000 00000000 00000000 00000101
int b = 9; //00000000 00000000 00000000 00001001
// & 符号左右运算结果是布尔值的时候做不短路与运算
// & 符号左右运算结果是整数的时候做按位与运算
//按位与运算规则是:两个数字的二进制的每一位进行按位运算,都为1才是1
System.out.println(a & b); //00000000 00000000 00000000 00000001 1
// | 符号左右运算结果是布尔值的时候做不短路或运算
// | 符号左右运算结果是整数的时候做按位或运算
//按位或运算规则是:两个数字的二进制的每一位进行按位运算,都为0才是1
System.out.println(a | b); //00000000 00000000 00000000 0001101 13
//单目(一元)运算符:表达式中只有一个操作数
//双目(二元)运算符:表达式中有两个操作数
//~符号做按位非运算,单目运算符,每个二进制位全部取反,包括符号位
System.out.println(~a); //11111111 11111111 11111111 1111 1010 -6的补码
System.out.println(~b); //11111111 11111111 11111111 1111 0010 -10
//二进制的 原码 反码 和 补码之间的关系
//计算机只认识0和1,所有的数字计算机中都是以二进制的补码形式存储
//正数的原码=反码=补码
//负数的反码=反码除符号位按位取反
//负数的补码=反码+1
//原码---补码
//原码 11111111 11111111 11111111 0110
//反码(符号位除外,取反) 10000000 00000000 00000000 1001
//补码 (+1) 10000000 00000000 00000000 0110
//补码---原码
//补码 11111111 11111111 11111111 11111010
//反码(-1) 11111111 11111111 11111111 11111001
//原码(符号位除外,取反) 10000000 00000000 00000000 00000110 -6
//补码 11111111 11111111 11111111 11111010
//取反(符号位除外,取反) 10000000 00000000 00000000 00000101
//原码(+1) 10000000 00000000 00000000 00000110 -6
//9
//00000000 00000000 00000000 00001001 9的原码
//11111111 11111111 11111111 11110110 按位取反的结果 结果的补码
//补码---原码
//方法一:
//(符号位除外,取反) 10000000 00000000 00000000 00001001
//(+1)10000000 00000000 00000000 00001010 -10
//方法二:
//(-1)11111111 11111111 11111111 11110101
//(符号位除外,取反)10000000 00000000 00000000 00001010 -10
//5 00000000 00000000 00000000 00000101
//9 00000000 00000000 00000000 00001001
//& 00000000 00000000 00000000 00000001 同1为1
//| 00000000 00000000 00000000 00001101 有1为1
//^ 00000000 00000000 00000000 00001100 同0异1
//~ 取反
//7 00000000 00000000 00000000 00000111
//11 00000000 00000000 00000000 00001011
//& 00000000 00000000 00000000 00000011 同1为1 3
//| 00000000 00000000 00000000 00001111 有1为1 15
//^ 00000000 00000000 00000000 00001100 同0异1 12
//~7 11111111 11111111 11111111 11111000
// (-1) 11111111 11111111 11111111 11110111
//(符号位除外,取反)10000000 00000000 00000000 00001000 -8
//~11 11111111 11111111 11111111 11110100
// (-1) 11111111 11111111 11111111 11110011
//(符号位除外,取反)10000000 00000000 00000000 00001100 -12
int c = 7;
int d = 11;
System.out.println(c&d);
System.out.println(c|d);
System.out.println(c^d);
System.out.println(~c);
System.out.println(~d);
// << 左移运算符 丢弃高位,低位补0
//面试题?
//如何用最快的速度计算 3*4 (3<<2) 8/2 (8>>3)
// 左移n位 相当于 a * 2^n
// 3 0011
System.out.println(3<<1); // 0110 6
System.out.println(3<<2); // 1100 12
System.out.println(3<<3); // 1 1000 24
// >> 右移运算符 丢弃低位,正数高位补0,负数高位补1
// 右移n位 相当于 a / 2^n
//1000 8
System.out.println(8>>1); // 0100 4
System.out.println(8>>2); // 0010 2
// 0001 1
System.out.println(8>>3);
// >>> 无符号右移运算符,丢弃低位,高位补0
System.out.println(-8>>1);
System.out.println(-8>>2);
System.out.println(-8>>3);
//负数的无符号右移 数会非常大
System.out.println(-8>>>1);
System.out.println(-8>>>2);
System.out.println(-8>>>3);
}
}
7、三目运算符
格式:条件表达式 ? 值1 : 值2
执行流程:条件为true,返回值1,若为false,则返回值2