目录
一、基础概念
1、接口
1.1 GUI
- 施乐首先推出图形化界面
- 缺点:消耗更多内存;巡行速度慢
1.2 命令接口
Windows下的CMD命令行
1.2.1 常用CMD命令
- 盘符名称+冒号(英文状态下):盘符切换
- dir:查看当前路径下的内容,会显示包含隐藏文件的所有内容
- cd 目录:进入单级目录
- cd ..:回退到上一级目录
- cd 目录1\目录2\...:进入多级目录
- cd \:回退到盘符目录
- cls:清屏
- exit:退出命令提示符窗口
1.2.2 问题
对于常用的应用程序,运行前需要通过命令行启动可执行文件,但是部分可执行文件打开时需要切换盘符(麻烦)。对此,可以将应用程序的路径记录在特定位置=>配置环境变量(高级系统设置)=>系统先在当前目录下查找是否存在该应用程序,若不存在,则在环境变量中寻找=>实现了在任意目录下打开指定的软件。
2、JDK安装目录
- bin:路径下存放各种工具命令,如javac和java
- conf:路径下存放相关配置文件
- include:路径下存放一些平台特定的头文件
- jmods:路径下存放各种模块
- legal:路径下存放各模块的授权文档
- lib:路径下存放工具的补充JAR包
3、java程序编写运行流程
- 记事本编写程序(.java文件)
- 编译文件(javac .java文件)(.class字节码文件):javac是JDK提供的编译工具
- 运行程序(java 文件名不加.class后缀名):java是JDK提供的运行代码的工具
4、java三大使用平台
4.1 Java SE
Java语言的标准版,用于桌面应用的开发,是后两个版本的基础。桌面应用指用户打开程序,程序界面会让用户在最短时间内找到所需功能,同时主动带领用户完成工作并得到最好的体验,通常使用C/C++语言。
4.2 Java ME
Java语言的小型版,用于嵌入式电子设备(电视机、数码相机等)或者小型移动设备(手机)。
4.3 Java EE
Java语言的企业版,用于Web方向的网站开发。网站开发包括浏览器和服务器的开发。
5、java跨平台
Write Once, Run Anywhere: Java程序可以在任意平台(Windows、Linux等操作系统)运行。
- 高级语言编译运行方式:编程——编译——运行
- 虚拟机:Java语言的跨平台性是通过虚拟机实现的,它不是直接运行在操作系统里,而是运行在虚拟机中的。因此,可以针对不同的操作系统,安装不同的虚拟机。
6、JRE和JDK
6.1 JDK组成
JDK(Java Development kit):Java开发工具包
- JVM(Java Virtual Machine):Java虚拟机,真正运行Java程序
- 核心类库:事先定义好的类库,可直接使用,如System。
- 开发工具:javac编译工具、java运行工具、jdb调试工具、jhat内存分析工具等。
6.2 JRE组成
JRE(Java Runtime Environment):Java运行环境
- JVM
- 核心类库
- 开发工具:不完整,但必须包含java运行工具
6.3 JDK、JRE、JVM关系
JDK包含JRE,JRE包含JVM。
二、基础语法1
1、注释
- 单行注释://
- 多行注释:/* */
- 文档注释:/** */
注意:注释内容不参与程序的编译和运行(不会出现在.class文件中);多行注释内不能嵌套注释
2、关键字
- 关键字:是Java中被赋予了特定涵义的英文单词,字母全部小写
- class:用于创建或定义一个类
3、常量(字面量)
- 整数类型
- 小数类型
- 字符串类型:双引号括起来的内容
- 字符类型:单引号括起来的,且仅有一个的内容
- 布尔类型:表示真假(true/false)
- 空类型:一个特殊的值,空值(null)。不能直接打印,可以以字符串的形式打印
特殊的字符:
- '\t':制表符。在打印的时候,把'\t'前面的字符串的长度补齐到8或8的整数倍,至少补1个空格,至多补8个空格=>使表格数据对齐
4、变量
- 使用场景:当某个数据的值经常发生改变时,可以用变量存储。当数据变化时,只需要修改变量内记录的值。
- 定义格式:数据类型 变量名 = 数据值;
- 注意:一个变量在一个时刻只能存储一个值;变量名不允许重复定义;一条语句可以定义多个变量,可同时初始化;变量在使用前需要进行赋值;变量使用需要注意其作用域范围
5、计算机的存储规则
三类数据:(任意数据都是以二进制形式存储)
(1)Text文本(数字,字母,汉字):数字直接转换为二进制,字母通过ASCII码表查询,汉字查询gb2312以找到唯一对应的数字。Unicode编码(国际标准字符集)将世界各种语言的每个字符定义唯一的编码,以满足跨语言、跨平台的文本信息转换。
(2)Image图片:黑白图,灰度图,彩色图
- 分辨率:宽*高=>分割成若干个小格子
- 像素:每个小格子称为一个像素,例如宽n个像素,高m个像素=>定义一个软件大小
- 黑白图:每个像素点赋值为0或1,0为黑,1为白
- 灰度图:灰度表用0~255表示灰度数据(0表示纯黑,255表示纯白),每个像素点具有特定的灰度
- 彩色图:三原色(RGB红绿蓝),每种颜色的深度用一个值表示,值越大越深,值的范围0~255。每个像素点用不同程度的三原色搭配形成。
(3)Sound声音 :波形图,每个点有对应的数字
JDK7版本后,不同进制在代码中的表现形式:
- 二进制:由0和1组成,并以0b开头
- 十进制:由0~9组成,且不加任何前缀
- 八进制:由0~7组成,并以0开头
- 十六进制:由0~9、a~f组成,且以0x开头
6、数据类型
6.1 基本数据类型
- 整数:byte(1B)(-128~127)、short(2B)、int(4B)(默认)、long(8B)(以l/L为后缀)
- 浮点数:float(4B)(以f/F为后缀)、double(8B)(默认)
- 字符:char(2B)
- 布尔:boolean(1B)(true/false)
取值范围:double>float>long>int>short>byte
6.2 引用数据类型
- 基本数据类型:栈中的变量存储的是真实的数据的值
- 引用数据类型:通过new关键字创建,栈内存中的变量记录的是数据存放在堆内存中的地址值,且堆内存中记录的是成员变量的具体值,以及成员方法在方法区中的地址值(对象)。“引用”其他内存空间
7、标识符
标识符是用户自定义的类、方法、变量名,必须遵守以下规则
- 由数字、字母、下划线、美元符组成
- 不能以数字开头
- 不能是关键字
- 标识符区分大小写
提高代码可读性:
- 方法、变量:小驼峰命名法=>标识符是一个单词的时候,全部小写;标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写
- 类名:大驼峰命名法=>标识符是一个单词的时候,首字母大写;标识符由多个单词组成的时候,每个单词首字母大写
8、键盘录入
(1)Scanner类可以接收键盘输入的数字
- 导包:import java.util.Scanner;
- 创建对象:Scanner sc = new Scanner(System.in);
- 接收数据:根据数据类型调用方法
|
|
9、获取随机数
(1)Random类可以生成一个随机数
- 导包:import java.util.Random;
- 创建对象:Random r = new Random();
- 生成随机数:int number = r.nextInt(随机数范围);
- 随机数范围:nextInt(n)=> [0,n-1)
- 任意数m~任意数n => [m,n]—转换—[0,n-m]—转换—[0,n-m+1)=> nextInt(n-m+1)+m
10、项目结构
project(项目)=>module(模块)=>package(包)=>class(类)
11、运算符
- 运算符:对字面量(常量)或变量进行操作的符号
- 表达式:用运算符把字面量或变量连接起来、符合java语法的式子,不同运算符连接的表达式体现的是不同类型的表达式。
11.1 算术运算符:+、-、*、/、%(取模或取余)
注意:浮点数参与的计算,结果可能不精确;整数除法的结果向下取整
%应用场景:判断a是否可以被b整除;判断a是否为偶数;环形队列
(1)'+':
- 数字相加 => 类型不同时,先类型转换再相加
- 隐式转换:自动把取值范围小的数据类型转换为取值范围大的数据类型;
byte、short、char会先转为int再进行计算
(byte->short->int->long->float->double)
byte b1 = 1; byte b2 = 2; result = b1 + b2; => int |
- 强制转换:把取值范围大的数值赋给取值范围小的变量,可能导致数值错误
格式:目标数值类型 变量名 = (目标数据类型)被强制转换的数据
byte b1 = 1; byte b2 = 2; byte result = (byte)(b1 + b2); |
- 字符串相加 => 字符串的连接符,前后字符串拼接并产生新的字符串;两个操作数中至少有一个为字符串;连续'+'时,从左到右逐个执行(注意单个+两侧操作数类型)
- 字符相加 => 字符+字符、字符+数字 => 把字符通过ASCII码表查询到对应的数字再进行计算;如果另一个操作数为字符串,则直接进行拼接
'A' = 65 0x41 | 'Z' = 90 0x5A |
'a' = 97 0x61 | 'z' = 122 0x7A |
11.2 自增自减运算符:++、--
- 自增自减运算符在单独使用时,无论在变量的前面或后面,运算结果一样
- 自增自减运算符参与计算(包括赋值、比较等操作)时,运算符在变量后面则先用后自增/自减,运算符在变量前面则先自增/自减再用。
11.3 赋值运算符:=、+=、-=、*=、/=、%=
- +=、-=、*=、/=、%=底层隐含了一个强制类型转换,转换成运算符左侧操作数的数据类型
11.4 关系运算符:==、!=、>、>=、<、<= 结果为true/false
11.5 逻辑运算符:&(逻辑与)、|(逻辑或)、^(逻辑异或)、!(逻辑非)
优化:短路逻辑运算符,可能提前结束判断(此时,右侧的表达式不会运算),最终运算结果不变。
- &必须判断两个条件 => &&(短路与):先判断左侧条件是否为true,若不是则直接返回false。反之,接着判断右侧条件是否为true。
- |必须判断两个条件 => ||(短路或):先判断左侧条件是否为ture,如是则直接返回true。反之,接着判断右侧条件是否为true。
11.6 三元运算符:关系表达式?表达式1:表达式2;
- 先判断关系表达式的真假,若结果为真,则执行表达式1,否则执行表达式2.
- 作用:可以进行判断,并根据判断的结果得到不同的内容,可以嵌套
11.7 运算符的优先级
优先级 | 运算符 |
1 | . () {} |
2 | ! - (负号) ++ -- |
3 | * / % |
4 | + - |
5 | << >> >>> |
6 | < <= > >= instanceof |
7 | == != |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ? : |
14 | = += -= *= /= %= &= |
12、原码、反码、补码
- 原码:十进制数据的二进制表现形式,最高位为符号位(0正1负);利用原码对正数进行计算不会出现问题,但是对负数进行运算时实际结果会与我们预期结果相反。
- 反码:为了解决原码不能计算负数的问题 => 正数的反码和原码相同,负数的反码在原码的基础上,符号位不变,数值位全部取反。
- 补码:为了解决正负零和负数计算问题(即负数计算时跨0的问题) => 正数的补码和原码相同,负数的补码在反码的基础上加1。计算机中的存储与运算均以补码形式进行的。
隐式转换:在被转换的数值高位补符号位
强制转换:取被转换的数值低位,转换后最高位为符号位
运算符补充:
&(逻辑与):两个操作数直接以十进制形式出现,则运算时先转换为补码。如果数据类型不一致,则低位的数据补齐至高位。最后按位与得到一个新的补码。
|(逻辑或):两个操作数直接以十进制形式出现,则运算时先转换为补码。如果数据类型不一致,则低位的数据补齐至高位。最后按位或得到一个新的补码。
注意:不能用短路逻辑运算符计算两个数值
<<(左移):向左移动n位,低位补0 => 乘2^n
>>(右移):向右移动n位,高位补符号位 => 除2^n
>>>(无符号右移):向右移动n位,高位补0
三、基础语法2
1、流程控制语句
1.1 顺序结构
顺序结构语句是java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行
1.2 分支结构
- if 语句:
if(关系表达式){ // 单条件判断 语句体; } |
|
if(关系表达式){ // 双条件判断 语句体1; } else { 语句体2; } |
if(关系表达式1){ // 多条件判断 语句体1; } else if(关系表达式2){ 语句体2; } ... else{ 语句体 n+1; } |
- switch 语句:在已有的多选项中选择
switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2 break; ... default: 语句体n+1; break; } |
|
|
switch和if语句的第三种格式(多条件判断):
|
switch (day){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("输入错误");
}
switch (day){
case 1,2,3,4,5:
System.out.println("工作日");
break;
case 6,7:
System.out.println("休息日");
break;
default:
System.out.println("输入错误");
}
// JDK12后的新特性
switch (day){
case 1,2,3,4,5 -> System.out.println("工作日");
case 6,7 -> System.out.println("休息日");
default -> System.out.println("输入错误");
}
1.3 循环结构
- for循环:
for(初始化语句;条件判断语句;条件控制语句){ 循环体语句; } |
|
- while循环:
初始化语句; while(条件判断语句){ 循环体语句; 条件控制语句; } |
- for循环和while循环对比
相同:运行规则一致,可以相互转换 |
区别: for循环:控制循环的变量如果在初始化语句中定义的,则在循环结束后会被自动释放掉,之后的语句不能直接使用 while循环:控制变量是在循环外定义的,不归属于while语法结构中,在循环结束后不会被释放掉,还可以继续直接使用 for循环:一般知道循环次数或循环的范围 while循环:不知道循环的次数或范围,只知道循环结束的条件 |
- do...while循环
初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); |
|
- 无限循环:后面不能写其它代码
for(;;){ 循环体语句; } |
while(true){ 循环体语句; } |
do{ 循环体语句; } while(true); |
- 跳转控制语句
|
2、数组
2.1 介绍
数组是一种容器,可以用来存储同种数据类型的多个值。允许存放的数据进行隐式转换,例如int(byte、short、int)
2.2 定义和初始化
格式一: 数据类型[ ] 数组名 例:String[] name; 格式二: 数据类型 数组名[ ] |
初始化:在内存中为数组容器开辟空间,并将数据存入容器 => 创建后数组长度不变,且数组名相当于一个指针,记录数组的地址值
>> 动态初始化:只明确元素个数,不明确具体数值 >> 静态初始化:需求中已经明确要操作的具体数据 |
2.3 元素访问
格式: 数组名[索引] |
索引(下标、角标):[0,n-1] |
2.4 数组遍历
|
2.5 数组内存图
- Java内存分配:运行时虚拟机占用一块空间,包括栈、堆、方法区、本地方法栈和寄存器五个区 => JDK8后取消方法区新增元空间,把方法区的多种功能进行拆分,部分功能在堆中,部分功能在元空间中。
|
- 数组内存图:栈中存放数组地址值,堆中存放具体的数组;两个数组指向同一个空间的内存图(数组名赋值,指向同一块数据)
3、方法
3.1 定义
- 方法(method)是程序中最小的执行单元;可以将重复的代码、具有独立功能的代码抽取到方法中;提高代码的复用性和可维护性
- main方法:主方法,是程序运行的入口
3.2 格式
- 形参:形式参数,是方法定义中的参数,多个形参用逗号隔开
- 实参:实际参数,是方法调用中的参数,多个实参用逗号隔开
- 方法:方法体(需要做什么)、形参(操作过程需要什么)、返回值(return方法结果)
3.3 重载
- 同一个类中,定义多个同名方法,这些同名方法具有同种功能。但是每个方法具有不同的参数类型或参数个数(形参不同),这些同名方法构成重载关系。
- 即“同一个类中,方法名相同,参数不同的方法,且与返回值无关”,参数不同:个数不同或类型不同或顺序不同
- Java虚拟机通过不同的参数来区分同名方法
3.4 值传递
- 传递基本数据类型时,传递的是真实的数据类型(将实参的纸赋给形参),在方法内改变形参不会影响实参的值
- 如果需要更新实参的值,需要在方法中返回形参,并将返回的值赋给实参
- 传递引用数据类型时,传递给形参的是地址值,形参指向真实的数据,形参的改变会影响实际参数的值
3.5 二维数组
- 需求:对数据进行分组管理
- 初始化
静态初始化
数据类型[][] 数组名 = { {元素,元素}, {元素,元素} }; |
动态初始化
|
- 访问:数组名[索引][索引] => 数组名[i]:第i个一维数组的地址值
- 遍历:先得到一维数组,在遍历得到的一维数组
- 内存图:
4、面向对象
4.1 类和对象
- 类:对象共同特征的描述
- 对象:真实存在的具体实际,先设计类才能得到对象
- 定义类
public class 类名 { 成员变量(属性) 成员方法(行为) 构造器 代码块 内部类 } |
- 获得类的对象
类名 对象名 = new 类名() |
- 使用对象
访问属性:对象名.成员变量 访问行为:对象名.方法名(参数列表) |
- 补充
|
|
|
4.2 封装
- 对象封装了数据以及对数据操作的行为,例如setXxx()、getXxx()
4.3 变量
- 成员变量:类的内部,方法的外部;有默认初始化值;存放在堆内存中;生命周期:对象
- 局部变量:方法的内部或参数列表中;没有默认初始化值,在使用前需要赋值;存放在栈内存中;生命周期:方法
- 作用域:就近原则,通过this.成员变量名直接使用同名的成员变量而不是局部变量
4.4 构造方法
- 构造器、构造函数:在创建对象时对成员变量进行赋值
格式: 修饰符 类名(参数){ 方法体; } |
|
4.5 内存
(1)一个对象的内存图
|
(2)两个对象的内存图
- Javabean类的class文件只需要加载一次
- 在堆内存中开辟的两个空间是相互独立、互不影响的
(3)两个引用指向同一个对象
(4)this关键字
- 作用:区分局部变量和成员变量
- 本质:所在方法调用者的地址值