方法:
概述:程序中可能会出现用到一些功能,这些功能会在程序的不同地方使用,重复的代码不希望重复写在Java的源文件中。所以我们想把这些功能给封装起来。
定义:也就是将重复的代码放到一个大括号内,并且给它起上一个名称,当我们去使用这些功能时,直接去找它的名称。
方法的定义:
结构:
修饰符 返回值类型 方法名(形参列表){
方法体;
return 值;
}
说明:
修饰符:主要限定方法的权限,还有静态,以及最终的这些修饰
返回值类型:返回值就是方法的产出,返回值类型就是限定了这个产出结果的类型;返回值类型 需要用return关键字来声明
方法名:就是给这些重复代码起的名称,在内存中会开辟一个空间,也是这个空间的名称
形参列表:为什么要有参数:有些方法的功能需要一些前提条件,参数就可以将这些数据传递给我们的方法,让方法去完成功能
形式参数:这些数据大多数形况下是不确定具体的值。就需要在方法中定义变量来去准备接收传递的具体的值
方法体:就是我们方法功能的实现代码
方法的调用
当方法被声明之后,不能直接运行,还需要对方法进行调用
调用的格式:
方法名(实参列表);
说明:方法名就是被调用的方法的名称;实参列表:形参没有具体的值,这个值是在我们调用阶段才去确定的值。所以我们就需要用实参给形式参数进行赋值,参数需要用逗号隔开
调用的分类:
1、赋值调用:接收调用方法之后的返回值:数据类型 变量名 = 方法名(实参);int num = getSum(2,2);
2、输出调用:直接打印方法的返回的结果:System.out.println(getSum(1,2));
3、直接调用:对于有返回值的方法是无效的,对于不需要返回值的方法的返回值是有效的;getSum(1,2);
方法的注意事项:
方法的定义:
1、方法是不能够嵌套定义的;2、定义的顺序是没有关系的;3、方法之间是平级的关系;4、方法能够嵌套调用,并且方法可以调用自己(递归)
方法的参数:
形式参数:就相当于在方法中声明了变量,我们具体的逻辑使用这个形式参数的变量名来操作。
形式参数在定义时必须声明数据类型,使用逗号隔开
实际参数:实际参数再去给形式参数赋值的过程叫做传参,就是给形式参数夫一个具体的值。实际参数的类型必须跟形参的类型保持一致,java中只有位置传参。所以传递的参数都是一一对应的。实际参数之间使用逗号隔开
返回值:
return的作用:1、首先可以直接将方法结束掉。在它之后的代码不会继续执行;2、return之后就是我们方法的产出结果,这个结果的类型必须跟返回值类型保持一致或者是兼容。
方法的调用:
直接调用对于有返回值的方法是无效的,可以在其他方法中对另外一个方法进行嵌套调用。
方法的内存分析:
java.exe-->jvm-->main-->方法
方法的重载
概述:在一个类中,方法名相同,参数列表不相同,与返回值无关
说明:
在一个类中:其他类的相同名称的方法跟本类中的方法无关
方法名相同:指的就是我们可以调用相同的方法名完成不同的功能
参数列表不相同:指的是我们需要用不同的参数列表来区分相同名称的方法的不同功能
1、参数的个数不相同;2、参数的类型不相同;3、参数的顺序不相同 这种方式跟变量名无关,不建议使用(代码冗余)
我们之前见过的重载的情况:
System.out指的是输出流 printlnStream 里面重载了很多的println方法
好处:
对于我们调用者和学习者来说就不需要记忆大量的方法名。
数组:
数组的定义
概述:数组实际上就是一个存放数据的容器
容器:将所有的数据可以存放在一个容器中,这时候操作数据就可以直接通过容器来操作
数组在存储数据和操作数据时不需要声明变量名,并且执行的效率很高
定义的格式:
数据类型[] 数组名 = new 数据类型[数组的长度];
数组通过索引(角标,下标,脚标)来操作数据
索引就是给数组中的每个元素加上一个数字标记,索引就是从零开始的数字
从数组中储存元素值的格式:数组名[索引值] = 元素值;
从数组中取出元素的值:数组名[索引];
打印数组名称的值:[I@7852e922
[:表示这个数组是一个一维数组
I:表示这个数组是一个int类型的数组
@:这是一个连接符,没有具体的含义
7852e922:这是一个hashcode码值通过数组的地址值计算得到的一个以16进制表示的数值。
数组的初始化:
就是给数组在内存中开辟空间用来存储数组的元素值
初始化方式:
1、动态初始化:
格式:数据类型[] 数组名 = new 数据类型[数组的长度];
就是在数组定义完成之后逐个对数组的元素进行赋值;
在数组的定义阶段一定要指明数组的长度。
2、静态初始化的方式
是在定义数组的过程中直接对数组的元素进行赋值
格式:
数据类型[] 数组名 = new 数组类型[]{元素的罗列};
数组前后的数据类型必须保持一致
罗列的数组地元素地类型也要跟声明时地类型保持一致
数组地长度不需要再去声明时指定
静态声明的简写:
数据类型[] 数组名 = {元素的罗列};
数组中的两个常见异常:
1、ArrayIndexOutOfBoundsException 角标越界的异常
说明:当我们访问数组中不存在索引时,就会出现这样的异常。
避免:对输入的索引值进行变量的封装,再取值时判断这个变量的范围。
2、NullPointerException 空指针异常
指针是在其他语言中的定义,不属于Java语言,我们Java语言对内存中的地址进行了封装和保护,无法去直接操作这个地址,所以Java中的说法叫“引用”。空指针异常就相当于在内存中对象没有指向任何的引用,再去操作这个引用时就出现了空指针异常
避免:在大多数功能实现之前都需要我们去判断对象是否指向了空的引用
jvm的内存分配:
jvm在去执行时会去window操作系统中占用一部分内存
栈内存【常用】所有的变量在声明之后都需要到栈内存中开辟空间存储相应的值
基本数据类型的变量:存储它自身的值
引用数据类型:需要在栈内存中开辟空间去存储相应地址值
声明的方法也会进入栈内存的空间中。
堆内存【常用】
垃圾堆 堆内存就相当于垃圾场 ,它是一个相对较大的内存空间,复杂的引用数据类型会在堆内存中存储值
方法区【常用】
会去储存一些较大的数据,储存的周期也相当于较长,加载类的字节码文件、常量、静态的资源
本地方法区: 存储了一些Java运行时需要的资源C;
存储计数器:控制了Java程序运行时的逻辑
数组的内存情况: