数组
数组介绍
数组:是一种容器,可以用来存储同种数据类型的多个值
· 数组容器在存储数据的时候,需要结合隐式转换考虑
· 例如:int类型的数组容器(boolean× , byte√,short√,int√ , double×)
· 例如:double类型的数组容器(boolean× , byte√,short√, int√,long√,float√, double√)
建议:容器的类型,和存储的数据类型保持一致
数组的定义与静态初始化
数组的定义
格式一:数据类型 [] 数组名
格式二:数据类型 数组名[]
数组的初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组初始化的两种方式:静态初始化,动态初始化
静态初始化
完整格式:数据类型 [] 数组名 = new 数据类型[]{元素1...元素n};
简化格式:数据类型 [] 数组名 = {元素1...元素n};
数组的地址值
数组的地址值表示数组在内存中的位置
//扩展 //解释一下地址值的格式含义 [D@776ec8df //[:表示当前是一个数组 //D:表示当前数组里面的元素都是double类型的 //@:表示一个间隔符号。(固定格式) //776ec8df:才是数组真正的地址值。(十六进制) //平时我们习惯性的会把这个整体叫做数组的地址值 数组元素访问 格式:数组名[索引]; 索引:也叫做下标,角标。 索引的特点:从0开始,逐个+1增长,连续不间断 数组遍历 数组遍历:将数组中所有的内容取出来,取出来之后可以(打印,求和,判断...) 注意:遍历指的是取出数据的过程,不要局限的理解为,遍历就是打印! 数组动态初始化
为什么有数组动态初始化呢?
一开始不知道数组中的值时适合动态初始化。
int[] arr = {1,2,3,4,5};
int[] arr = {???};
数组动态初始化
动态初始化:初始化时指定数组长度,由系统为数组分配初始值
格式:数据类型[] 数组名= new 数据类型[数组长度];
范例:int[] arr = new int[3];
//数组默认初始化值的规律 //整数类型:默认初始化值0 //小数类型:默认初始化值0.0 //字符类型:默认初始化值‘/u0000’ 空格 //布尔类型:默认初始化值 false //引用数据类型:默认初始化值 null
数组内存图 Java内存分配 · 栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 栈内存: 程序的主入口(main方法)开始执行时会进栈,代码执行完毕会出栈 · 堆 存储对象或者数组,new来创建的,都存储在堆内存 堆内存: new出来的东西会在这块内存中开辟空间并产生地址,每块小空间的地址值都是不一样的 · 方法区 存储可以运行的class文件 · 本地方法栈 JVM在使用操作系统功能的时候使用,和我们开发无关 · 寄存器 给CPU使用,和我们开发无关 在JDK7以前,方法区和堆区是连在一起的,在真实物理存储中也是连续空间,这种设计方式不是很好 注意: 从JDK8开始,取消方法区,新增元空间。 把原来方法区的多种功能进行拆分,有的功能放到了堆中,有的功能放到了元空间中。 数组的内存图 1.只要是new出来的一定是在堆里面开辟了一个小空间 2.如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据 两个数组指向同一个空间的内存图 1.当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次访问的时候都是修改之后的结果了。 栈区、堆区、方法区、本地方法栈、寄存器 数组常见问题 · 当访问了数组中不存在的索引,就会引发索引越界异常 数组常见操作 求最值、求和并统计个数、交换数据、打乱数据
方法(method)
什么是方法
1.什么是方法
方法是程序中最小的执行单元。
2.实际开发中,什么时候用到方法?
重复的代码、具有独立功能的代码可以抽取到方法中。
3.实际开发中,方法有什么好处?
· 可以提高代码的复用性
· 可以提高代码的可维护性
方法的格式
命名规范:小驼峰命名法
把一些代码打包在一起,用到的时候就调用
方法定义
把一些代码打包在一起,该过程称为方法定义。
方法调用
方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用。
方法的定义格式
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
注意:方法必须先定义后调用,否则程序将报错。
注意:方法调用时,参数的数量与类型必须与方法定义中小括号里面的变量一一对应,否则程序将报错。
最简单的方法定义
最简单的方法定义和调用
方法定义
格式:
public static void 方法名(){
方法体(就是打包起来的代码);
}
范例:
public static void playGame(){
七个打印语句;
}
方法调用
格式:
方法名();
范例:
playGame();
带参数的方法定义
带参数的方法定义和调用
定义:
单个参数
格式:
public static void 方法名(参数){... ...}
范例:
public static void method(int number){... ...}
多个参数
格式:
public static void 方法名(参数1,参数2,...){... ...}
范例:
public static void getSum(int number1,int number2){... ...}
调用:
单个参数:方法名(参数);
范例1:method(10);
范例2:method(变量);
多个参数:方法名(参数1,参数2,......)
范例1:getSum(10,20);
范例2:getSum(变量1,,变量2);
带返回值方法的定义
方法的返回值其实就是方法运行的最终结果
· 如果在调用处要根据方法的结果,去编写另外一段代码逻辑
· 为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法
带返回值方法的定义和调用
定义:
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
范例:
public static int getSum(int a,int b)
{
int c = a+b;
return c;
}
调用:
直接调用:方法名(实参);
赋值调用:数据类型 变量名 = 方法名(实参);
输出调用:System.out.println(方法名(实参));
方法的注意事项
· 方法不调用就不执行
· 方法与方法之间是平级关系,不能互相嵌套定义(不能在一个方法里定义方法,但是可以在方法里调用其他方法)
· 方法的编写顺序和执行顺序无关(与调用顺序有关)
· 方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写。如果要编写return,后面不能跟具体的数据。
· return语句下面,不能编写代码,因为永远执行不到,属于无效代码
return关键字
· 方法没有返回值:可以省略不写。如果书写,表示结束方法
· 方法有返回值:必须要写。表示结束方法和返回结果
方法的重载
· 在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
· 每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系
· 简单记:同一个类中,方法名相同,参数不同的方法。与返回值无关。
参数不同:个数不同、类型不同、顺序不同
方法的内存
方法调用的基本内存原理
方法传递基本数据类型的内存原理
基本数据类型
· 整数类型
· 浮点数类型
· 布尔类型
· 字符类型
变量中存储的是真实的数据
引用数据类型
除了基本数据类型外的其他所有类型
变量中存储的是地址值
引用:使用了其他空间中的数据
从内存的角度去解释:
基本数据类型:数据值是存储在自己的空间中
特点:赋值给其他变量,也是赋的真实的值
引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值
特点:赋值给其他变量,赋的是地址值
方法传递引用数据类型的内存原理
传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值
传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值
方法传递参数的结论
基本数据类型:
传递的是真实的数据
引用数据类型:
传递的是地址值
Debug查看方法调用的流程
注意
进入一个方法的时候,需要用Step Into F7
在方法内部,看每一行代码的执行流程,使用Step Over F8
注意观察方法的出现和消失,以及变量的变化
形参和实参
形参:方法定义中的参数
实参:方法调用中的参数
192

被折叠的 条评论
为什么被折叠?



