导图社区 Java基础
Java程序 * 它将输出 Hello World * 这是一个多行注释的示例*/publicstaticvoidmain(String[]args){//这是单行注释的示例/*这个也是单行注释的示例*/System.ou...
编辑于2022-09-26 20:25:59 四川省listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
社区模板帮助中心,点此进入>>
listener 音标['lisnә] 读音 汉语翻译 n. 收听者, 听众 英语解释: 名词listener: someone who listens attentively 同义词:hearer, auditor, attender
Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1、Filter快速入门 1.1、步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方法 d...
会话的解释 [conversation] 指两人以上的对话(多用于学习别种语言或方言时) 详细解释 (1).聚谈;对话。现多用于学习别种语言或方言时
Java基础
入门介绍
Java、JVM
Java 编程环境出现于 20 世纪 90 年代末,由 Java 语言和运行时组成。运行时也叫 Java 虚拟机(Java Virtual Machine,JVM)
Java
一种人类可读的编程语言,詹姆斯高斯林(James Gosling)在Sun公司(Stanford University Network)于1995年推出
特点
简单:在原有编程语言如C++基础上作了改进,降低了学习成本
面向对象:模拟人的思维写程序,万物皆对象
可移植性(跨平台性):一次编写,随处运行,是重要优势
高性能:通过JIT(Just in Time)即时编译技术实现
分布式:能处理tcp/ip协议,支持远程方法调用(RMI)
动态性:允许程序动态地装入运行过程中所需要的类
重要发展节点
2004 Java5.0
2014 Java8.0
2019 Java12.0
JVM
JVM 是一个程序,提供了运行 Java 程序所需的运行时环境。如果某个硬件和操作系统平台没有相应的 JVM,就不能运行 Java 程序。提供给 JVM 运行的程序不是 Java 语言源码,源码必须转换(或编译)成一种称为 Java 字节码的格式。提供给 JVM 的 Java 字节码必须是类文件格式,其扩展名为 .class。JVM 是字节码格式程序的解释器,一次只执行字节码中的一个指令。
目的
包含一个容器,让应用代码在其中运行。
较之 C/C++,提供了一个安全的执行环境。
代开发者管理内存。
提供一个跨平台的执行环境,一次编写,到处运行
平台指操作系统,如Windows、Mac、Linux
跨平台指Java程序可在任意操作系统上运行
JVM虚拟机本身不允许跨平台,类似现实中的翻译,每种操作系统都有对应的Java虚拟机
JVM 会收集运行时信息,从而对如何执行代码做出更好的决定。也就是说,JVM 能监控并优化运行在其中的程序
Java的三个版本
Java SE(标准版)
可用于桌面应用的开发,为从事JavaEE开发打基础
Java ME(小型版)
可用于嵌入式消费类电子设备,无需关注
Java EE(企业版)
可用于Web方向的网站开发,网站=网页+后台服务器,是学习的重点
JDK、JRE
开发Java程序步骤
1.编写代码得.java文件
编写代码的过程中,需要用到java存放在JRE中,已经写好的java文件
.java文件属于源文件,无法被JVM所识别执行
2.编译代码得.class文件
通过JDK中的编译工具将.java文件编译成.class,即字节码文件
字节码文件可被JVM直接识别并执行
DOS命令:javac 文件名.java
3.运行代码
通过JDK的运行工具将.class文件运行在JVM中
DOS命令:java 类名
图示
JDK
JDK(Java Develop Kit)是Java语言的软件开发工具包,内部包含了代码的编译工具和运行工具
JRE
JRE(Java Runtime Environment),指Java运行环境,包含JVM虚拟机及Java核心类库。
主要功能
加载代码:由class loader 完成
校验代码:由bytecode verifier 完成
执行代码:由 runtime interpreter完成
相关说明
类:java文件在代码中的集合体现(类=java文件,一个java程序,一个java类)
类库:存放多个java文件的仓库
核心类库:Java已经写好的,非常核心的,代码仓库
JDK、JRE、JVM关系
开发java程序仅安装JDK即可
JDK的下载于安装
官网:http://www.oracle.com
步骤
1. 选择版本
2. 同意协议
3. 查看电脑的环境(64位,还是32位等等)
4. 下载安装包
5. 安装JDK (改安装目录,注意规范,建议统一放Develop文件夹下)
6. 配置电脑的环境变量
原因
能够在任意目录(文件夹路径)下,都能访问到bin目录中的javac和java工具
步骤
1. 我的电脑(win+E)-->右键--->属性--->高级系统设置--->高级
2. 环境变量-->添加 JAVA_HOME (JDK的安装地址,不带bin目录)
3. 配置path系统变量:%JAVA_HOME%\bin ;%JAVA_HOME%jrebin
7. 测试是否安装成功
1. 打开cmd(命令行窗口)
2. 输出 java –version 查看版本信息,是否成功输出!
注意
针对不同操作系统,下载对应的JDK
JDK安装目录
DOS命令提示符
学习目的
为了使用JDK,即bin目录中的(javac.exe)编译工具、(java.exe)运行工具
双击bin目录中的(javac.exe)编译工具、(java.exe)运行工具一闪而过的黑色窗口即是DOS命令提示符,就是说JDK提供的编译运行工具并不是双击运行使用的,而是在DOS中通过指令去运行
打开DOS命令提示符
1.win+R
2.输入cmd
3.回车
常用的DOS命令
helloWorld程序
注意
大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的
空白:Java 会忽略空格、制表符、换行符和其他空白,除非这些符号出现在引号或字符串字面量中
类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass
方法、变量名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)
主方法入口:所有的 Java 程序由 public static void main(String []args) 方法开始执行
基础语法
词法结构
注释
介绍
注释并不会被编译、执行,是给我们写代码的人看的,书写注释是一个非常好的习惯
分类
单行注释
只能注释当前行,以//开始,直到行结束
多行注释
注释一段文字,以/*开始, */结束!
文档注释
用于生产API文档,配合JavaDoc
/** @Description HelloWorld类* @Author Diamond **/
关键字
介绍
关键字:被Java赋予特定含义的英文单词
特点
关键字字母全部小写
在常用代码编辑器中用特殊颜色标记
注意
main不是关键字,但也非常关键,JVM执行代码时只会识别该单词
Java 语言不使用 const 和 goto,但它们也是关键字
有些关键字(尤其是 final 和 default)根据不同的上下文有不同的意义
标识符
介绍
是 Java 程序中某个部分的名称,例如类、类中的方法和方法中声明的变量
定义规则
由数字、字母、下划线_和美元符$组成
不能以数字开头
不能是关键字
区分大小写
命名约定
方法、变量
小驼峰命名法
类
大驼峰命名法
常量
介绍
常量:在程序的执行过程中,其值不会发生改变的量(数据)
字面量:通常是直接写在赋值(=)号右边的常量
自定义常量:由final关键字修饰的变量
常量命名规范
如果是一个单词,所有字母大写,如果是多个单词,所有字母大写且用'_'分开
字面量分类
字符串常量:被双引号所包裹的内容
整数常量:所有整数
小数常量:所有小数
字符常量:被单引号包裹的内容,里面只能存放单个字符
布尔常量:只有两值,true(真),false(假)布尔常量单独打印没有意义,为了后面要学习的运算符,打基础
空常量:null,数组部分详细讲解 注意:null空常量不能输出打印
变量
介绍
变量:就是内存中的存储空间,空间中存储着经常发生改变的量(数据)
变量定义格式
数据类型 变量名 = 数据值;
注意
变量名不允许重复定义
一条语句可以定义多个变量,但需要使用逗号进行分割一条语句:java当中使用分号作为一条语句的结束.
变量在使用之前一定要进行赋值
定义float类型变量的时候:需要在数值后面加入F的标识,F可以大写也可以小写.定义1ong类型变量的时候:需要在数值后面加入L的标识,L可以大写也可以小写
变量的作用域:只在它所在的大括号中有效
标点符号
分隔符
12个:( ) { } [ ] ... @ :: ; , .
运算符
进制
介绍
进制:指进位制,是人们规定的一种进位方式,表示某一位置上的数,运算时是逢X进一位
原因:计算机数据在底层运算的时候,都是以二进制形式了解不同的进制,便于我们对数据的运算过程的理解
常见进制
十进制
逢10进1
0-9
书写格式
Java中,数值默认都是10进制,不需要加任何修饰
二进制
逢2进1
0-1
书写格式
数值前面以0B开头,B大小写都可以
八进制
逢8进1
0-7
书写格式
数值前面以0开头
十六进制
逢16进1
0-9 A-F(大小写均可)
书写格式
数值前面以0x开头,x大小写都可以
注意
书写的时候,虽然加入了进制的标识,但打印在控制台展示的都是十进制数据
进制转换
十进制-->二进制
除2取余倒排
二进制-->十进制
按位乘权相加
二进制-->八进制
三位压成一位
八进制-->二进制
一位展成三位
二进制-->十六进制
四位压成一位
十六进制-->二进制
一位展成四位
补充
8421码
8421码又称BCD码,是BCD代码中最常用的一种
BCD:(Binary-Coded Decimal)二进制码十进制数
在这种编码方式中,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的十进制数
原码反码补码
介绍
计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的
原码
看数据
就是二进制定点表示法,即最高位为符号位,[0]表示正,[1]表示负,其余位表示数值的大小
反码
转数据
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外
补码
运算数据
正数的补码与其原码相同;负数的补码是在其反码的末位加1
注意
正数的原反补都是相同的
负数的【反码】,是根据【原码】取反(0变1,1变0)得到的(符号位不变)
负数的【补码】,是根据【反码】的末尾+1,得到的
位运算
介绍
位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算
在二进制位运算中,1表示true,0表示false
基本位运算符
&
位与
遇false则false,遇0则0
|
位或
遇true则true,遇1则1
^
位异或
相同为false,不同为true
一个数,被另外一个数,异或两次,该数本身不变
~
取反
全部取反,0变1,1变0(也包括符号位)
位移运算符
<<
有符号左移运算,二进制位向左移动,左边符号位丢弃,右边补齐0
运算规律
向左移动几位,就是乘以2的几次幂
>>
有符号右移运算,二进制位向右移动,使用符号位进行补位
运算规律
向右移动几位,就是除以2的几次幂
>>>
无符号右移运算符,无论符号位是0还是1,都补0
数据类型及其转换
介绍
计算机中最小的存储单元叫"字节(byte)",通常用大写字母”B“表示,一个字节包含8个连续比特位
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
引用数据类型
类
class
接口
interface
数组
[]
类型转换
隐式转换
将数据类型中,取值范围小的数据,给取值范围大的类型赋值,可以直接赋值
小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
byte short char三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
强制转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
格式:目标数据类型 变量名=(目标数据类型)值或者变量;
强制类型转换,有可能会发生精度损失
补充
Java具有常量优化机制
byte d= 3 + 4;
在编译时(javac),就会将3和4计算出一个7的结果,并且会自动判断该结果是否在byte取值范围内 在:编译通过 不在:编译失败
不能对boolean类型进行类型转换
注意
常量【没有手动指定数据类型】,但只要是数据,就会存在数据类型
浮点类型默认为double
整数类型默认为int
运算符、表达式
运算符
介绍
对常量或者变量进行操作的符号
分类
算数运算符
+
把两个操作数相加
字符的'+'操作
a+b的运算中,a为int类型,b为char类型当(byte short char int)在一起运算的时候,都会提升为int之后,再进行运算char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
'a'=97 'A'=65 '0'=48
字符串的'+'操作
当+操作中出现字符串时,这个+是[字符串连接符],而不是算术运算
-
从第一个操作数中减去第二个操作数
*
把两个操作数相乘
/
分子除以分母
两边都是整型的话,结果就是一个整型。3/2的结果就是1
如果有一边是小数,那么结果就是小数。3/2.0的结果就是1.5
%
取模运算符,整除后的余数
两边运算对象必须是整型
7.0%3
4%3.
3.即是3.0
求值方法:先忽略符号不计求出余数,再将所得余数的符号定成与被除数相同的符号即可
例
17%3=2
17%-3=2
-17%3=-2
-17%-3=-2
自增自减运算符
++
自增运算符,整数值增加 1
--
自减运算符,整数值减少 1
B = ++A、B = --A(++在前先加后用)B = A++、B = A--(++在后先用后加)
赋值运算符
=
C = A + B 将把 A + B 的值赋给 C
+=
C += A 相当于 C = C + A
-=
C -= A 相当于 C = C - A
/=
C /= A 相当于 C = C / A
*=
C *= A 相当于 C = C * A
%=
C %= A 相当于 C = C % A
注意
扩展赋值运算符底层会自带强转功能
关系(比较)运算符
==
检查两个操作数的值是否相等,如果相等则条件为真
!=
检查两个操作数的值是否相等,如果不相等则条件为真
>
检查左操作数的值是否大于右操作数的值,如果是则条件为真
<
检查左操作数的值是否小于右操作数的值,如果是则条件为真
>=
检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真
<=
检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真
注意
关系运算符的结果都是boolean类型,要么是true,要么是false
逻辑运算符
&
逻辑与运算符。遇false则false,只有符号左右两边同时为true,结果才为true
|
逻辑或运算符。遇true则true,只有符号左边两边同时为false,结果才为false
!
逻辑非运算符。用来逆转操作数的逻辑状态。
^
逻辑异或运算符。相同为false,不同为true
注意
关系运算符的结果都是boolean类型,要么是true,要么是false
短路逻辑运算符
&&
短路与
作用和&相同,但是有短路效果
&和&&的区别
&:无论符号左边是true还是false,右边都要继续执行&&:具有短路效果,符号左边为false的时候,右边就不执行了
||
短路或
作用和相同,但是有短路效果
三元运算符
如果条件为真 ? 则值为 X : 否则值为 Y
表达式
介绍
用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式
不同运算符连接的表达式体现的是不同类型的表达式
语句与控制结构
语句
表达式语句
合法的表达式语句有赋值、递增和递减、方法调用以及对象创建
复合语句
{}是函数体标志,也是复合语句标志如果是复合语句标志,则算一条语句
空语句
空语句使用一个分号;表示
在 for 循环中可以使用空语句表明循环体为空
标注语句
标注语句就是有名称的语句
命名方法
在语句前加上一个标识符和一个冒号
break 和 continue 语句会用到标注
局部变量声明语句
一个变量声明语句可以声明和初始化多个变量,但是所有变量必须是同一类型
Java 编译器不允许使用未初始化的局部变量,所以,方便起见,通常会在一个语句中同时声明和初始化变量
变量声明语句可以以 final 关键字开头。这个修饰符表明,为变量指定初始值之后,其值就不能改变了
在 Java 代码的任何地方都能使用变量声明语句,而不局限于只能在方法和代码块的开头使用
补充
int a = 10;算两条语句,分成 int a、a=10两条
注释语句
不执行,帮助理解程序
控制语句
if/else、switch、for、while、do/while、break、continue、return
遍历语句
“遍历循环”(foreach loop)的句法可以处理需要循环的对象集合
synchronized语句
Java 提供的 synchronized 语句可以帮助程序员处理多线程时,避免多个线程同时修改同一个对象,以防对象的状态有冲突
throw语句
throw 语句用于抛出异常
try/catch/finally语句
异常处理语句
assert语句
assert 语句用来验证 Java 代码的设计假想
输出语句
system.out.print()
system.out.println()
具有换行效果
三种基本结构
顺序结构
定义
从main()开始,由上往下执行每一条语句
选择机构
if - else
分类
if语句
表达式的值为true,就执行操作1(操作1可包含多条语句),表达式的值为false,往下继续执行
if (表达式) { 操作1}
表达式的值为ture,就执行语句(只有一条语句),表达式的值为false,往下继续执行
if (表达式) 语句;
if else语句
表达式的值为true,就执行操作1,表达式的值为false执行操作2(操作1,2可包含多条语句)
if (表达式) { 操作1} else { 操作2}
表达式的值为true,就执行语句1,表达式的值为false执行语句2(语句1,2只能是单条语句)
if (表达式) 语句1;else 语句2
并列的if else语句
首先计算判断条件1的值如果值为true就执行语句体1;如果值为false就计算判断条件2的值如果值为true就执行语句体2;如果值为false就计算判断条件3的值...如果没有任何判断条件为true,就执行语句体n+1.
if (表达式1) { 操作1} else if (表达式2) { 操作2} else if (表达式3) { 操作3} ...else if (表达式n) { 操作n} else { 操作n+1}
注
操作1~n+1中只有一个可以执行
嵌套的if else语句
如果表达式1的值为true,判断表达式2的值是否为true,如果表达式2的值为true,执行操作1,否则判断表达式3的值是否为true,如果为true,执行操作2,否则执行操作3
if (表达式1) { if (表达式2) { 操作1 }} else { if (表达式3) { 操作2 } else { 操作3 }}
注
多种形式的if、if else、并列的if else、嵌套的if else等可以相互组合和嵌套,但是不建议嵌套太多层,那样会减低程序的可阅读性
注意
不加括号只对一条语句起作用,对多条语句起作用用括号建议写if语句时加上括号
else与最近邻的if相匹配
switch
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查
switch(表达式){ case 值1 : 语句体1; break; case 值2 : 语句体2; break; .... default : 语句体n+1;}
注意
表达式:(将要被匹配的值)取值为byte,short,int,char,JDK5以后可以是枚举,JDK7以后可以是String.
case:后面跟的是要和表达式进行比较的值(被匹配的值)
case给出的值不允许重复,而且只能是常量,不能是变量
每一个case语句后面的break如果省略会出现case穿透现象,当开始case穿透,后续的case就不会具有匹配效果,内部语句都会执行,直到出现break
break表示中断,用来结束switch语句
如果case都不满足,则执行default语句
循环结构
for 循环
for 循环允许编写一个执行指定次数的循环控制结构
for ( init; condition; increment ){ statement(s);}
控制流程
init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可
接下来,会判断 condition。如果为true,则执行循环主体。如果为false,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止
注意
注意边界问题(通常 左闭右开)
for循环内部定义的变量,在循环结束后,就会从内存中消失
while 循环
只要给定的条件为true, while 循环语句会重复执行一个目标语句
while(condition){ statement(s);}
statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块
condition 可以是任意的表达式,当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句
do...while 循环
不像 for 和 while 循环,它们是在循环头部测试循环条件。在 C 语言中,do…while 循环是在循环的尾部检查它的条件,do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环
do{ statement(s); }while( condition );
最后的分号不能丢
条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次
如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止
三种循环语句比较
在知道循环次数的情况下更适合使用for循环
在不知道循环次数的情况下适合使用while或者do-while循环,如果有可能一次都不循环应使用while循环,如果至少循环一次应使用do-while循环
从本质上讲,while,do...while和for循环之间可以相互转换
条件控制语句所控制的自增变量
为归属for循环的语法结构中,在for循环结束后,就不能再次被访间到了
对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
注意
如果循环控制流中条件表达式的值永远为true,称为死循环,通常是应该避免的在命令提示符窗口Ctrl+C可以结束死循环
转移控制语句
break语句
break 语句,可以跳出循环结构,还可以跳出 switch语句
不能用于循环语句和 switch 语句之外的任何其他语句中
在多层循环中,一个break语句只跳出当前循环
使用break语句,可以跳出死循环
在循环语句与switch语句嵌套使用时,需要对break进行指定。break和continue只能跳出、跳过自己所在的那一层关系,如果想要跳出、跳过指定的一层就可以加入标号。
lo:while(){} ---> break lo;跳出指定循环
在没有循环结构的情况下,break不能用在单独的if else语句中
continue语句
continue 的用法十分简单,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定
continue和break的区别
continue 语句和 break 语句的区别是,continue 语句只结束本次循环,而不是终止整个循环,break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立
continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用
return语句
return 语句告诉 Java 解释器,终止执行当前方法
如果声明方法时指明了有返回值,return 语句后面必须跟着一个表达式。这个表达式的返回值就是这个方法的返回值
有些方法声明时使用了 void,指明不返回任何值。Java 解释器运行这种方法时,会依次执行其中的语句,直到方法结束为止。执行完最后一个语句时,解释器隐式返回。然而,有时没有返回值的方法要在到达最后一个语句之前显式返回。此时,可以使用后面没有任何表达式的 return 语句。
内存分配
介绍
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分每一片区域都有特定的处理数据方式和内存管理方式
分类内存
栈内存
方法运行时,进入的内存,局部变量都存放于这块内存当中
堆内存
new出来的内容都会进入堆内存,并且会存在地址值
方法区
字节码文件(.class文件加载时进入的内存
本地方法栈
调用操作系统相关资源
寄存器
交给CPU去使用
内存分配的默认值
整数
0
浮点数
0.0
布尔
false
字符
空字符
引用数据类型
null
补充
引用数据类型:引用、记录了地址值的变量,所对应的数据类型,就是引用数据类型
例如:int[] arr= new int[3]; int[] arr就是
案例分析
数组
多数组
两个数组指向相同
注意
每new一次,在堆内存中,都是一块新的空间,堆内存中的空间地址不会出现重复的现象
数组
介绍
定义
数组是相同类型数据的有序集合.
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们
数组元素的编号从零开始,有效的索引范围是零到元素数量(数组长度)减一
特点
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的
其元素必须是相同类型,不允许出现混合类型
数组中的元素可以是任何数据类型,包括基本类型和引用类型
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
创建定义、初始化、访问
定义、声明格式
数据类型[] 变量名
int[] array
首选
数据类型 变量名[]
int array[]
注意
这样只是定义了一个数组类型的变量,并没有初始化,不能直接使用
创建数组
使用new操作符来创建数组,语法如下:arrayRefVar = new dataType[arraySize];
使用 dataType[arraySize] 创建了一个数组
把新创建的数组的引用赋值给变量 arrayRefVar
初始化
静态初始化
手动指定数组元素,系统会根据元素个数计算出数组的长度
格式
完整
数据类型[] 数组名= new 数据类型[]{数据1,数据2,数据3...};
简化
数据类型[] 数组名={数据1,数据2,数据3...};
例子
使用场景
只明确元素个数,不明确具体数值,推荐使用动态初始化
动态初始化
数组定义、为数组元素分配空间、赋值的操作,分开进行手动指定数组长度,由系统给出默认初始化值
例子
使用场景
需求中已经明确了要操作的具体数据,直接静态初始化即可
默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化,参考内存分配
元素访问
介绍
数组变量访问方式
格式:数组名
数组内部保存的数据的访问方式
格式:数组名[索引]
索引是数组容器中空间的编号
特点
索引从0开始
索引是连续的
索引逐一增加,每次加1
作用
访问数组容器中的空间位置
注意
数组在创建完毕后,即使没有赋值也可以取出,但取出的元素都是默认初始化值
数组遍历
动态获取数组元素个数
数组名.length
格式
注意
遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印
二维数组
介绍
二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器
定义格式
初始化
动态初始化
格式
例子
打印二维数组细节
@:分隔符
10f87f48:十六进制内存地址
I:数组中存储的数据类型
[[:几个中括号就代表的是几维数组
静态初始化
格式
例子
二维数组遍历
数组操作常见问题
索引越界
访问了数组中不存在的索引,造成索引越界问题
空指针异常
访问的数组已经不再指向堆内存的数据,造成空指针异常
null:空值,引用数据类型的默认值,表示不指向任何有效对象
方法
介绍
方法(method)就是一段具有独立功能的代码块,不调用就不执行
方法的出现可以提高代码的复用性
注意
方法不能嵌套定义
方法必须先创建才可以使用,该过程称为方法定义
方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为方法调用
方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return 句不写如果要编写return,后面不能跟具体的数据
return语句下面,不能编写代码,因为永远执行不到,属于无效的代码
定义、调用
定义
格式
例子
调用
格式
例子
注意
方法必须先定义后调用,否则程序将报错
方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储
方法被调用的时候,需要进入到栈内存中运行,先进后出
带参数方法的定义、调用
为何产生
提高程序灵活性
形参和实参
形参
全称形式参数,是指方法定义中的参数
实参
全称实际参数,方法调用中的参数
定义
格式
调用
格式
注意
方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
方法定义时,多个参数之间使用逗号(,)分隔
方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
带返回值方法的定义、调用
为何产生
我们经常会根据一个方法产出的结果,来去组织另外一段代码逻辑为了拿到这个方法产生的结果,就需要定义带有返回值的方法
定义
格式
例子
调用
格式
例子
注意
方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
方法的通用格式
格式
说明
public static
修饰符
返回值类型
方法操作完毕之后返回的结果数据,所对应的数据类型
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
方法名
调用方法时候使用的标识
参数
由数据类型和变量名组成,多个参数之间用逗号隔开
理解:方法运行之前所需要的材料
方法体
完成功能的代码块
return
如果方法操作完毕,有数据返回,用于把数据返回给调用者
注意
定义
明确参数:主要是明确参数的类型和数量
明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
调用
void类型的方法,直接调用即可
非void类型的方法,推荐用变量接收调用
方法重载
介绍
方法名相同,参数也完全相同,称为方法的重复定义是一种冲突性的错误
调用方法的时候,Java虚拟机会通过参数的不同来区分同名的方法
同一个类中,方法名相同,参数不同的方法构成了重载关系
优点
不用记忆过多繁琐的方法名字
注意
参数不同:个数不同、类型不同、顺序不同
识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关
方法的参数传递
基本数据类型
传入方法中的,是具体的数值
引用数据类型
传入方法中的,是内存地址.