JAVA基础
一、什么是JAVA
Sun公司在1995年向外发布推广的一款面向对象的高级程序设计语言
其主要应用于互联网后端服务器开发,大数据,安卓,网页,游戏等领域
二、JAVA语言技术体系
-
JavaSE(Java Platform Standard Edition)
Java标准版,主要包含Java基础语法,主要用于开发桌面软件及游戏
-
JavaME(Java Platform Micro Edition)
Java微型版,主要用于开发移动端设备和嵌入式设备的软件,如手机、pda、机顶盒、车载等
-
JavaEE(Java Platform Enterprise Edition)
Java企业版,主要用于开发互联网企业后台服务器端,为企业级开发提供解决方案
企业级软件:
公司:OA、ERP、CRM、SNS、财务、人事考勤…
学校:学生管理系统、宿舍管理系统、考试系统…
互联网:百度,京东,淘宝,B站…
其他:教育、视频、直播、电信、电力、金融、电商
三、Java语言特点
- 应用面广
- Java简单易学(相对于C/C++)
- 面向对象(更符合我们看待事务特点)
- 跨平台(一处编译,处处运行)
- 多线程(提升系统的运行性能和效率)
- 分布式(解决高并发,高可用,高性能问题)
- 健壮性(强类型、垃圾回收、异常处理)
- 安全性
- 开源
四、Java开发环境搭建
-
JVM
Java Virtual Machine
Java虚拟机
Java程序是运行在虚拟机之上,JVM是Java程序能够实现跨平台的基础
-
JRE
Java Runtime Environment
Java运行时环境
JRE=JVM+运行时需要的环境
-
JDK
Java Develop Kit
Java 开发工具包
提供给Java开发人员使用的,其中包含Java开发需要的软件
JDK=JRE+Java开发工具
五、环境变量配置
-
新建JAVA_HOME
变量名:JAVA_HOME
变量值:填写JDK 安装目录
-
新建CLASSPATH
变量名:CLASSPATH
变量值:.
.;%JAVA_HOME%\lib
.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
-
找到Path
新建:%JAVA_HOME%\bin
新建:%JAVA_HOME%\jre\bin
测试环境变量是否配置成功:
- win+R打开运行窗口
- 输入cmd。点击确定打开命令行窗口
- 输入javac或者java -version
- 显示日志或者版本号则表明配置成功,不显示则表示配置失败
六、跨平台
因为有了JVM,同一份字节码文件可以在三个不同的平台上都能运行,这样就实现了Java程序的跨平
七、第一个Java程序
-
Java项目的目录结构
Java Project
Java工程,Java项目,可以理解为是一个总文件夹
JRE System Library
Java运行环境(系统库)
src
编写Java源代码的位置
bin
用于存储编译后的.class字节码文件
-
Package
包,创建在src下面,可以理解为是一个子文件夹
-
Class
类,创建在Package下面,就是一个Java源文件
-
Java程序运行方式
4.1 菜单栏点击绿色箭头
4.2 右键–>Run As–>Java Application
4.3 Ctrl+F11
-
Java中注释
-
注释:对Java代码起到一个解释说明的作用,不参与编译和运行过程,相当于产品说明书
单行注释://
多行注释:/*
*/
文档注释:/**
*/
注意:main函数,程序执行的入口
public static void main(String[] args){}
注意:输出语句
System.out.println(“要输出的内容”);
-
基本语法规范
7.1大小写严格区分
7.2中英文严格区分(所有阔符号如为
7.3括号必须成对出现
7.4没行代码结束之后必须以分号结尾
7.5大括号标识一个结构,结尾不用打分号
-
进制
-
二进制:
逢二进一
二进制转十进制
二进制 权(2^n)
-
十进制:
逢十进一
十进制转二进制 短除法
-
八进制:
逢八进一
-
十六进制:
逢十六进一
10进制 2进制 8进制 16进制 0 0000 0 0 1 0001 1 1 2 0010 2 2 3 0011 3 3 4 0100 4 4 5 0101 5 5 6 0110 6 6 7 0111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F 16 10000 20 10 在计算机中所有的数据(图片、音频、文本等资源)都是以2进制补码形式进行存储
根据原码计算补码:
-
原码和补码是以0开头的数字表示正数,以1开头的数字表示负数,最前面1位是符号位
-
正数的补码和他的原码是相同的
-
负数的补码是他的原码符号位不变,其他位取反再加1
如果数据超出4位补码所能表示的范畴,
超出8位采用补码来进行表示,
超出8位采用16位
超出16位采用
原码:
十进制 7 ==二进制0111;-7 ==10000111,最高位表示符号位
反码:
正数和原码一样,负数除去最高位其余位取反,例如 -7 == 1 1111000
补码:
正数和原码一样,负数–>补码等于反码加1;例如 -7 ==反码 1 1111000 + 1 ==1 1111001
总结:
4位2进制补码最多可以表示2^4个数
范围-23---->23-1
8位2进制补码最多可以表示2^8个数
范围-28—>28-1
16位2进制补码最多可以表示2^16个数
范围-215—>215-1
32位2进制补码最多可以表示2^31个数
范围-231—>231-1
64位2进制补码最多可以表示2^64个数
范围-263—>263-1
在计算机中1个0或者1个1被称为叫1位
用 1 bit 表示,bit是计算机最小的数据存储单元
8位2进制补码通常被称为1个字节,用1byte来进行表示,是计算机中最小的操作单元
1byte = 8bit
1kb = 1024byte
1mb = 1024kb
1gb = 1024mb
-
-
变量
-
什么是变量
对应的是内存中的一块存储空间,可以用来存储一个值变量可以进行命名,可以通过变量名来操作变量中所存储的值变量中所存储的值是可以改变的
-
变量的使用
定义一个变量,类型为int,名称为X int = 10;
将10赋值给X
= 理解为赋值,将右侧的值赋值给左侧的变量
-
变量得定义和赋值
定义:也叫声明,在内存中开辟了一块空间
赋值:往往这块空间中存储一个数据
-
变量的作用域范围
从变量的定义的地方开始,到他所属代码块的结束
离开作用域范围后,该变量将被系统回收(无效了)
-
变量的命名规范
- 强制性命名规范(不遵守就报错)
- 建议性命名规范(不遵守不会报错,但是不专业)
-
-
数据类型
-
八种基本类型
-
整数类型(有范围)
1.1 byte 字节型 一个字节8位,范围 -27~27-1
1.2 short 短整型 两个字节16位,范围 -215~215-1
1.3 int 整型 四个字节32位,范围 -231~231-1
1.4 long 长整型 八个字节64位,范围 -263~263-1
如果右侧值超出了int最大值或最小值范围必须在数字后面带上L或者l
其中一个整数变成long类型,结果值就是long类型
在Java种,int是整数的默认类型
将一个整数赋值给byte类型变量时,会去掉前面3个字节,保留最后一个字节,所以右侧整数值不能超过byte范围
将一个整数赋值给short类型变量时,会去掉前面2个字节保留最后2个字节,所以右侧整数值不能超过short范围
将一个整数赋值给long类型变量时
如果右侧整数值超过了int的范围,必须带上L或l,将右侧默认的32值改为64
如果右侧整数数值诶有超出int范围,可以带上L或者l也可以不带,如果不带,整数前面补上32个0,负数前面补上32个1一般建议long类型都带上L或者l
-
小数类型
2.1 float
单精度浮点
32位,一个符号位,23个尾数位,8个指数位
2.2 double
双精度浮点
64位,一个符号位,52个尾数位,11个指数位
浮点数默认时double -->加上F或者f将右侧浮点数变为flaot类型
-
字符类型
char: 主要用于存储Java中的单个字符,其本质上存储的是一个16位无符号位(从0开始,最前面一位不表示符号)的整数,其范围[0~65535],使用char定义字符时,必须使用单引号引起来。且单引号中只能定义一个字符
编码:
给计算机中每个字符编一个数字,在计算机中存储这个字符时,实质上存储的是该字符对应的数字,再取出该数字时,再参考编码表,将该数字转化成字符
ASCII编码
只收录了英文字母和数字以及其他符号,范围时0-127,是单字节编码
Unicode编码
统一码,万国码
科学家统计了世界上几乎所有国家的语言文字,符号以及括号等,给每个字符都进行统一的编码,Unicode编码采用的是固定的双字节编码。范围0-65535,完全兼容ASCII编码
Java中的char类型参考的就是Unicode编码表
使用一个4位16进制Unicode编码来表示一个字符 例如:‘\u0064’
-
布尔类型
boolean,用于表示真和假
该类型只有两个值,true和false,true表示真,false表示假,该类型一般用于判断
-
String 字符串类型
字符:
只能用于存储单个字符,使用单引号引起来
字符串:
可以用于同时存储一道多个字符,使用双引号引起来
字符串可以和任意类型的变量之间使用+做拼接,拼接完成后的结果还是一个字符串
两侧都不是字符串时,+就是加法运算
-
类型转换
一般只会发生在整数裂隙和浮点类型之间,char字符类型只跟int整形之间转换,且都需要强转
byte->short->int->long->float->double
-
-
-
运算符
-
算术运算符
加号 减号 乘号 除号 自加 自减
X++:后加加 先赋值,后自身加1
++X:前加加 先自身加1,后赋值
X–:后减减 先赋值 后自身减1
–X:前减减 先自身减1 后赋值
int a = 10; a++ =10; a = 11 int a = 10; ++a = 11; a = 11; int a = 10; a-- = 10; a = 9; int a = 10; –a = 11; a = 9; -
比较运算符
小于号 大于号 小于等于号 大于等于号 等号 不等于号
-
赋值运算符
= += -= *= /= %=
-
逻辑运算符
&& : 逻辑与:&&并且(左右两边只能时布尔类型表达式)左侧表达式一&&右侧表达式二只有当布尔表达式一和布尔表达式二都是true的时候结果才是true,任何一个表达式的值为False 结果都是false
短路与:false && 布尔表达式
逻辑与运算,如果左侧表达式计算结果为false那么右侧表达式二无论时true还是false结果都是False,此时右侧布尔表达式二值不参计算
|| :逻辑或 左侧表达式一 || 右侧表达式二 只要左侧布尔表达式一和右侧表达式二任意一个值为true结果就是true只有当两个表达式都是false的时候,结果才是false。
短路或:true || 表达式二
逻辑或运算,如果左侧布尔值表达式计算结果为true,那么布尔表达式二的值无论时true还是false结果都是true此时右侧表达式不参与计算。
!:逻辑非 !后跟一个布尔表达式,非true就是false。非false就是true
逻辑与的优先级高于逻辑或
-
三项运算符
?:
-
不常用——————位运算符
& 位与 1 true 0 false 按位求与
-
| 位或 1 true 0 false 按位求或
- 位非 1变0 0变1
^ 异或 相同取0 不同取1
-
位移运算符
>> 带符号右移 正数右移左侧补0,负数右移左侧补1
>>> 无符号右移 正数负数右移,左侧补0
<< 带符号左移 正数负数左移,右侧补0
-
-
分支
if
如果布尔表达式判断位true则执行大括号中代码,如果为false则不执行
不论时true还是false都不影响后续带啊吗执行
if(布尔表达式){ 代码块 }
如果布尔表达式为true则则执行i放后面的大号中的代码块yiruguo weil false,则执行else后面的大括号中代码块2
如果i发或者else后面大括号中有一块代码可以省略大括号
多层嵌套
if(布尔表达式){代码块一}else if(布尔表达式){代码块二}
从上往下逐一判断所有if中的布尔表达式,只要有一个布尔表达式为true,就执行后面大括号中代码,执行完成后九立即跳出整个分支判断,后续的布尔表达式不在判断,如果所有布尔表达式判断为false,则执行else中代码块
switch_case
从上往下逐一和switch的变量进行匹配,如果匹配上了就执行case后面的代码块,如果碰到break就跳出整个分支判断,如果没有break就继续往下执行,知道碰到一个break再跳出如果所有case后面的值都没有匹配上联络就执行default下面的代码块。
swicth 后面小括号中允许的变量类型
jdk vetsion<=1.6
byte short int char enum
jdk version>=1.7
byte short int char enum String
switch(变量){ case 值: 代码块 break; case 值2: break; default: break; }
-
循环
重复的去执行某一段代码
for
for(初始化表达式;布尔表达式;修改循环体变量){ 循环体 }
布尔表达式为true则执行循环体,为false跳出循环
死循环:布尔表达式不写或者第二个表达式为true或者第三个表达式没有
while
while(布尔表达式){ 循环体 }
先判断,后执行循环体
do_while
do{ 循环体 } while (布尔表达式)
先执行一次循环体,再判断是否继续执行
-
数组
-
概念
对应内存中一块连续的储存空间,主要用于存储多个连续且类型相同的数据,数据中的每个数据叫做数组的元素
-
定义和赋值
静态初始化只能在定义的时候赋值
动态初始化支持先定义后赋值
-
特点
数组长度一旦确定就无能改变了
可以通过下标来获取或修改数组中的元素
数组中元素的下标从左到右,从0开始每次递增,最小下标0,最大下标length-1
-
数组扩容
因为数组的长度是不可变的,所以扩容实质上创新的长度不一样的数组,然后原来的数组中的元素复制到新的数组中
-
带返回值
新数组 = Arrays.copyOf(原数组,新数组的长度)
-
不带返回值
System.arraycopy(原数组,数组开始复制元素的下标,新数组,往新数组第几个下标位置开始放元素,从原数组复制几个元素到新数组);
System.arraycopy(Object src,int srcPos,Object dest, int destPos,int length)
Object src 原数组 int srcPos 原数组开始复制元素的下标
Object dest 新数组 int destPos 往新数组第几个下标位置开始放元素
int length 从原数组复制几个元素复制到新数组
-
-
二维数组
二维数组遍历,外层循环控制二维数组中的一位数组的下标,内层循环控制一位数组中元素的下标
-
数组的遍历
通过元素的下标遍历,下标范围0~length
for循环遍历
for~each迭代器
-
数组元素排序
将数组中元素按顺序从小到大或者 从大到小进行排序
-
冒泡排序
思想:第一次比较相邻的两个元素,若前面的元素比后面的元素大则交换,没一趟比较完成后,都能从剩下元素中选出一个最大值
-
插入排序
思想:将数组分为有序和无序两堆,每次从无序数组中取出第一个元素和有序数组 中的元素从后往前逐个比较,若比他小则交换,若比他大则停止交换
-
选择排序
思想:每次从待排序的数组中选出一个最小值,将其放在已经排序好的数组的最后面,直到所有元素都排序完成
-
快速排序
-
桶排序
-
-
-
函数
-
什么是函数
对代码块的提取和封装,并对其进行命名,也就是函数名,然后通过函数名可以对函数的调用,函数存在的目的是为了减少重复代码,实现代码复用
-
函数的定义
返回值类型
如果函数执行完成后需要给调用者一个返回值那么返回值类型就必须于结果值类型相同,同时在函数的最后通过return结果值
如果函数执行完成后不需要返回结果给调用者,那么返回值类型就写void代表无返回们同时函数中不能写return标识函数到此结束
return返回值
将函数计算的结果返回调用者,同时函数执行到此结束
return
指标是函数执行到此结束
命名规范和变量名相同
形参,形式参数
形参的作用就是规定传给函数的值必须是什么类型,在函数调用时会将实参值赋给形参
-
函数重载
同名不同参
一个类中多个函数之间函数名称相同但是参数列表不同但是参数列表不同,与返回值无关
-
函数的可变参数
定义一个函数,用于计算若干个整数的和传入几个整数,就将几个整数的和加起来,然后返回给调用者
语法:add(int… arr)
在调用add()函数时可以传入0到多个实参数值,在函数内部可变参数可以当做是数组来使用,可以进行遍历获取长度使用下标
注意:
- 一个函数中最多只能有一个可变参数
- 如果有其他形参时,可变参数必须放在最后
-
函数递归
注意:
- 递归必须指定结束条件,否则就会报错StackOverFlowError错误,栈内存溢出
- 递归的效率非常低一般不建议使用
递归的常见使用场景
- 求一个数的阶乘
- 求一个数的累加和
- 求斐波那契数列
- 文件夹遍历
- 二叉树
-
-
标识符
有程序员自己定义的包名、类名、变量名、函数名,需要满足一定的规范
- 强制性规范
- 建议性规范