一,Java语言跨平台原理
平台:指的是操作系统
跨平台原理:在需要运行 Java 应用程序的操作系统上,安装一个与操作系统对应的Java虚拟机(JVM Java Virtual Machine)即可
分析:JVM 本身是否可以跨平台?
答:JVM 虚拟机本身不允许跨平台,允许跨平台的是 Java 程序
二, JRE和JDK
JVM(Java Virtual Machine),Java虚拟机
JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API)
JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具
三,语法基础
1.注释:注释是在程序指定位置添加的说明性信息 简单理解,就是对代码的一种解释
注释分类:单行注释 :格式:// 注释信息
多行注释 : 格式:/* 注释信息 */
文档注释 :格式:/** 注释信息 */
2.关键字:被Java赋予特定含义的英文单词(例:public,class,void....)
关键字特点: 1.关键字的字母全部小写
2.常用的代码编辑器,针对关键字有特殊颜色标记,非常直观。如图所示:
main不是关键字,可以将其理解为,比关键字更为关键的一个单词,因为JVM在执行代码的时候,只会识别该单词
3.常量:在程序的执行过程中,其值不会发生改变的量(数据)
常量分类:
常量类型 | 说明 | 举例 |
字符串常量 | 用双引号括起来的内容 | “HelloWorld”,“黑马程序员” |
整数常量 | 不带小数的数字 | 666,-88 |
小数常量 | 带小数的数字 | 13.14,-5.21 |
字符常量 | 用单引号括起来的内容 | ‘A’,‘0’, ‘我’ |
布尔常量 | 布尔值,表示真假 | 只有两个值:true,false |
空常量 | 一个特殊的值,空值 | 值是:null |
4. 变量介绍 :变量就是内存中的存储空间,空间中存储着经常发生改变的量(数据
变量的定义格式:数据类型 变量名 = 数据值;
5.数据类型
计算机存储单元:
我们知道计算机是可以用来存储数据的,但是无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。而计算机中最小的存储单元叫“字节(byte)”, 通常用大写字母”B”表示,字节是由连续的8个位组成。
除了字节外还有一些常用的存储单位,大家比较熟悉,我们一起来看看:
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
……
数据类型:
Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的
数据类型内存占用和取值范围:
数据类型 | 关键字 | 内存占用 | 取值范围 |
整数 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int | 4 | -2的31次方到2的31次方-1 | |
long | 8 | -2的63次方到2的63次方-1 | |
浮点数 | float | 4 | 1.401298e-45到3.402823e+38 |
double | 8 | 4.9000000e-324 到1.797693e+308 | |
字符 | char | 2 | 0-65535 |
布尔 | boolean | 1 | true,false |
说明:e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方
6.变量的定义和使用
变量的定义:
1)变量的定义格式 : 数据类型 变量名 = 数据值;
变量的注意事项:变量名不允许重复定义
一条语句可以定义多个变量
变量在使用之前一定要进行赋值
定义float和long变量的注意事项
变量的作用域范围
7. 键盘录入
8.标识符:
就是给类,方法,变量等起名字的符号
标识符定义规则:由数字、字母、下划线(_)和美元符($)组成
不能以数字开头
不能是关键字
区分大小写
9.常见命名约定:
10.类型转换
转换类型的分类: 隐式转换 ,强制转换
隐式转换类型:把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
例:double d = 10;
隐式转换的过程:
隐式转换的细节:小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
特殊关注:byte short char 三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
范例:int k = (int)88.88;
注意:强制类型转换,有可能会发生精度损失 精度损失:简单理解,将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了.
四, 运算符
1.算术运算符
运算符和表达式:
运算符:对常量或者变量进行操作的符号
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明: int a = 10;
int b = 20;
int c = a + b;
+:是运算符,并且是算术运算符
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式
符号 | 作用 | 说明 |
+ | 加 | 参看小学一年级 |
- | 减 | 参看小学一年级 |
* | 乘 | 参看小学二年级,与“×”相同 |
/ | 除 | 参看小学二年级,与“÷”相同 |
% | 取余 | 获取的是两个数据做除法的余数 |
注意事项: /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。当(byte short char int)在一起运算的时候,都会提升为int之后,再进行运算
自增自减运算符
符号 | 作用 | 说明 |
++ | 自增 | 变量的值加1 |
-- | 自减 | 变量的值减1 |
++和-- 既可以放在变量的后边,也可以放在变量的前边。
注意事项:
单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。
参与操作的时候
如果放在变量的后边,先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(--)。
int a = 10;
int b = a++;
如果放在变量的前边,先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。
int a = 10 ;
int b = ++a;
2. 赋值运算符
符号 | 作用 | 说明 |
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
注意事项: 扩展的赋值运算符隐含了强制类型转换
3.关系运算符
符号 | 说明 |
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
注意事项: 关系运算符的结果都是boolean类型,要么是true,要么是false。 千万不要把“==”误写成“=”
4. 逻辑运算符
符号 | 作用 | 说明 |
& | 逻辑与 | a & b,a和b都是true,结果为true,否则为false |
| | 逻辑或 | a | b,a和b都是false,结果为false,否则为true |
^ | 逻辑异或 | a ^ b,a和b结果不同为true,相同为false |
! | 逻辑非 | !a,结果和a的结果正好相反 |
短路逻辑运算符
符号 | 作用 | 说明 |
&& | 短路与 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
注意事项:
逻辑与&,无论左边真假,右边都要执行。
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
逻辑或|,无论左边真假,右边都要执行。
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
5.三元运算符
格式:关系表达式 ? 表达式1 : 表达式2;
范例:a > b ? a : b;
计算规则:
首先计算关系表达式的值
如果值为true,表达式1的值就是运算结果
如果值为false,表达式2的值就是运算结果
五,分支语句
1.流程控制
流程控制语句:通过一些语句,来控制程序的【执行】流程
流程控制语句分类: 顺序结构 ,分支结构(if,switch) ,循环结构(for,while,do…while)
顺序结构语句:顺序结构语句是Java程序,默认的执行流程,按照代码的先后顺序依次执行。 从上到下,从左到右。
顺序结构:顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行, 程序中大多数的代码都是这样执行的
2.if语句
if语句格式1:
执行流程: 1.首先计算关系表达式的值
2.如果关系表达式的值为true就执行语句体
3.如果关系表达式的值为false就不执行语句体
4. 继续执行后面的语句内容
if语句格式2:
执行流程:1. 首先计算关系表达式的值
2. 如果关系表达式的值为true就执行语句体1
3. 如果关系表达式的值为false就执行语句体2
4. 继续执行后面的语句内容
if语句格式3:
执行流程: 首先计算判断条件1的值 如果值为true就执行语句体1;
如果值为false就计算判断条件2的值 如果值为true就执行语句体2;
如果值为false就计算判断条件3的值
…
如果没有任何判断条件为true,就执行语句体n+1
3.switch语句
switch语句格式和说明
执行流程: 1.首先计算表达式的值。
2. 依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
3. 如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后程序结束掉。
注意事项:1. case给出的值不允许重复 2.case后面的值只能是常量,不能是变量
switch语句的case穿透现象
注意:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象
现象:当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行 直到看见break,或者将整体switch语句执行完毕,才会结束
应用场景:当发现switch语句中,多个case给出的语句体出现了重复的,就可以考虑使用case穿透来优化代码。
六,循环语句
1.for循环语句
特征: 重复做某件事情 具有明确的开始和停止标志
for循环语句格式:
执行流程:1. 执行初始化语句
2. 执行条件判断语句 ,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
3. 执行循环体语句
4. 执行条件控制语句
5.回到②继续
2.while循环语句
while循环语句格式
3.do…while循环语句
do…while循环语句格式
三种循环的区别:
4.跳转控制语句
5.Random
七,数组
1.数组定义格式
数组介绍:数组(array)是一种容器,用来存储(同种数据类型)的多个值。
总结:数组容器在存储数据的时候,需要结合数据类型考虑。
例如:int类型的数组容器 (boolean byte short double)
建议:容器的类型,和存储的数据类型保持一致
数组容器的使用场景:
总结:如果今后要操作的数据,是同一组数据,就可以使用数组容器进行存储
2.数组初始化之动态初始化
数组初始化概述:
数组初始化方式:动态初始化,静态初始化
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
注意:打印数组变量名,出现的是数组在内存中的地址值
3. 数组元素访问
4.内存分配
java中内存分配:
栈内存:方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存:new出来的内容都会进入堆内存,并且会存在地址值
方法区:字节码文件(.class文件)加载时进入的内存
本地方法栈:调用操作系统相关资源 寄存器:交给CPU去使用
5. 数组初始化之静态初始化
静态初始化:初始化时,就可以指定数组要存储的元素,系统还会自动计算出该数组长度
两种初始化的区别对比:
使用场景:
6.数组操作的两个常见小问题
7.数组常见操作
1.数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..)注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印!
2. 获取数组元素数量:
3.获取最值
八,方法
1,方法概述
方法(method)就是一段具有独立功能的代码块,不调用就不执行(方法的出现,可以提高代码的复用性)
方法使用前提须知:
方法必须先创建才可以使用,该过程称为方法定义
方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
2,方法的定义和调用
方法定义:
方法调用:
方法调用过程:
3,带参数方法的定义和调用
带参数方法定义:
带参数方法调用:
形参和实参:
形参:全称形式参数,是指方法定义中的参数
实参:全称实际参数,方法调用中的参数
4,带返回值方法的定义和调用
为什么要有带返回值的方法?
:我们经常会根据一个方法产出的结果,来去组织另外一段代码逻辑 为了拿到这个方法产生的结果,就需要定义带有返回值的方法
带返回值方法定义:
带返回值方法调用:
方法的通用格式:
5,方法的注意事项
6,方法重载
方法重载概述:
注意:识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关
7,方法的参数传递
基本类型:对于基本数据类型的参数,形式参数的改变,不影响实际参数的值
引用类型:对于引用类型的参数,形式参数的改变,影响实际参数的值
九,二维数组
1.二维数组概述
什么是二维数组:二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器
2.二维数组动态初始化
二维数组定义格式:
格式1:数据类型 [ ] [ ] 变量名;
范例:int [ ] [ ] arr;
格式2:数据类型 变量名[ ] [ ];
格式3:数据类型[ ] 变量名[ ];
二维数组动态初始化:
3. 二维数组静态初始化
二维数组静态初始化:
格式:数据类型 [ ] [ ] 变量名 = new 数据类型[ ] [ ] { {元素1,元素2}, {元素1, 元素2} };
范例:int [ ] [ ] arr = new int [ ][ ] { {11,22} , {33,44} };
简化格式:数据类型 [ ] [ ] 变量名 = { {元素1,元素2}, {元素1, 元素2} };
范例:int [ ] [ ] arr = { {11,22} , {33,44} };
十,进制
1.进制介绍
为什么要学习进制?
不同进制的书写格式:
2.进制转换
3. 原码反码补码
注意:计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的
原码反码补码介绍:
4.位运算
位运算符介绍:
符号 | 计算方式 |
& | 遇到0(false)则0(false),两边同时为1(true),结果才是1(true) |
| | 遇到1(true)则1(true),两边都是0(false),结果才是0(false) |
^ | 相同为false,不同为true |
~ | 取反,二进制位全部取反,0变1,1变0,包括符号位 |
<< | 有符号左移运算,左边符号位丢弃,右边补齐0 |
>> | 有符号右移运算,根据符号位,补齐左边 |
异或运算的特点:一个数,被另外一个数,异或两次,该数本身不变。
案例:数据交换(不允许使用三方变量)
十一,面向对象基础
1.类和对象
面向对象和面向过程的思想对比:
什么是类:类是对现实生活中一类具有共同属性和行为的事物的抽象
类的组成:
类和对象的关系:(类是对象的描述 对象是类的实体)
类的定义:
对象的使用:
2.对象内存图
垃圾回收:
3.成员变量和局部变量
什么是成员变量和局部变量:(成员变量:类中方法外的变量 局部变量:方法中的变量)
成员变量和局部变量区别:
区别 | 成员变量 | 局部变量 |
类中位置不同 | 类中方法外 | 方法内或者方法声明上(形参) |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义,赋值,才能使用 |
4. 封装
private关键字
private关键字的使用:
this关键字:
(局部变量和成员变量如果重名,Java使用的是就近原则)
this关键字的作用:可以调用本类的成员(变量, 方法) 解决局部变量和成员变量的重名问题
this:代表所在类的对象引用
记住:方法被哪个对象调用,this就代表哪个对象
封装:
面向对象三大特征之一(封装,继承,多态)
隐藏实现细节,仅对外暴露公共的访问方式
问题:封装指的是私有吗:
答案:私有仅仅是封装的一种体现
将代码抽取到方法中,这是对代码的一种封装
将属性抽取到类当中,这是对数据的一种封装
5.构造方法
构造方法概述:构建、创造对象的时候,所调用的方法
构造方法作用:
作用:用于给对象的数据(属性)进行初始化
构造方法的注意事项:
标准类制作:
十二,字符串
1.String
String 常见构造方法:
方法名 | 说明 |
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc |
创建字符串对象的区别对比:
String字符串的特点:
String方法小结:
方法名 | 说明 |
public boolean equals(Object anObject) | 比较字符串的内容,严格区分大小写 |
public boolean equalsIgnoreCase(String anotherString) | 比较字符串的内容,忽略大小写 |
public int length() | 返回此字符串的长度 |
public char charAt(int index) | 返回指定索引处的 char 值 |
public char[] toCharArray() | 将字符串拆分为字符数组后返回 |
public String substring(int beginIndex, int endIndex) | 根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾) |
public String substring(int beginIndex) | 从传入的索引处截取,截取到末尾,得到新的字符串 |
public String replace(CharSequence target, CharSequence replacement) | 使用新值,将字符串中的旧值替换,得到新的字符串 |
public String[] split(String regex) | 根据传入的规则切割字符串,得到字符串数组 |
2. StringBuilder
StringBuilder概述:StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器。(作用:提高字符串的操作效率)
StringBuilder 的常用方法:
方法名 | 说明 |
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
public StringBuilder append (任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
public int length() | 返回长度 ( 字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
StringBuilder和String的区别:
StringBuilder 和 String 相互转化:
十二,集合基础
集合和数组的特点对比:
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
ArrayList集合
ArrayList构造方法和添加方法:
方法名 | 说明 |
public ArrayList() | 创建一个空的集合对象 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
ArrayList集合常用方法:
方法名 | 说明 |
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |