01-数组介绍
- 介绍 : 数组就是一种容器, 可以存储同种数据类型的多个值,是在内存中开辟的一片连续的内存空间
int[] arr = {10,20,'a'};
System.out.println(arr[2]);		// 97
double arr = {10,20,30};
System.out.println(arr[0]);		// 10.0
-----------------------------------------------
    
建议: 数组中存储同种数据类型
- 问题 : 什么时候使用数组呢 ? 
  - 要操作的数据有多个, 多个数据属于同一组数据, 就可以考虑使用数组容器
 
02-数组的定义格式
1. 数据类型[] 数组名;
		int[] arr;
2. 数据类型 数组名[];
		
		double arr[];
- 注意: 这种定义格式, 定义的仅仅是数组类型的变量, 容器还没有在内存中开辟空间
03-数组的静态初始化
-  初始化 : 在内存中, 为数组容器开辟空间, 并将数据存入空间的过程. 
-  静态初始化 : 
1. 完整格式: 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3...};
		int[] arr = new int[3]{11,22,33};
2. 简化格式: 数据类型[] 数组名 = {元素1, 元素2, 元素3...};
		int[] arr = {11,22,33};
注意: 打印数组名, 看到数组的十六进制内存地址
    
    	[I@233ac4
         
         
        @ : 分隔符 
        [ : 当前空间是一个数组类型, 几个中括号, 就是几维数组.
        I : 容器的类型
        233ac4 : 十六进制地址
04-数组的元素访问
- 格式 : 数组名[索引];
- 索引 | 下标 | 角标 : 数组中, 空间所对应的编号, 编号从0开始, 逐个+1进行增长.
int[] arr = {11,22,33,44,55};
System.out.pritnln(arr[0]);		// 打印
int result = arr[1] + 100;		// 计算
if(arr[2] % 2 == 0){			// 判断
}
arr[3] = 66;					// 修改
for(int i = 1; i <= arr[4]; i++){	// 循环
	System.out.println("itheima");
}
05-数组的遍历操作
- 介绍 : 将数组中每一个元素取出来
- 遍历的使用场景 : 如果要实现的需求, 要对数组中[每一个]元素进行操作, 就需要遍历数组
for(int i = 0; i < arr.length; i++){
	// i : 索引
	// arr[i] : 元素
}
数组名.length : 动态获取到数组的长度 (元素的个数)
06-数组的动态初始化
-  介绍 : 在初始化数组的时候, 只需要手动指定长度, 系统就会分配默认值 
-  格式 : 数据类型[] 数组名 = new 数据类型[长度]; 
int[] arr = new int[3];
System.out.println(arr[0]);		// 0
- 默认值的分类 :
整数: 0
小数: 0.0
布尔: false
字符: '\u0000'  ---> Unicode字符 ----> 常见的体现空白字符
引用数据类型 : null
--------------------------
引用数据类型: 数组, 类, 接口
null(空值) : 只能赋值给引用数据类型
-  两种初始化的区别 : - 静态初始化 : 手动指定元素, 系统会根据元素的个数, 自动计算长度
- 动态初始化 : 手动指定长度, 系统会分配默认值
 
-  两种初始化的使用场景 : - 静态初始化 : 如果要操作的数据, 需求中已经明确给出
 需求: 已知班级学生成绩为 100 20 100 30 100 int[] arr = {100,20,100,30,100};- 动态初始化 : 只知道要存几个数, 但是具体是啥不清楚
 需求: 键盘录入5个整数, 求最大值 需求: 产生10个1~100之间随机数, 求最小值
07-数组的内存图
- 方法区 : 字节码文件 (.class) 加载时所进入的内存
- 栈 : 方法运行的时候, 进入的内存
- 堆 : new 出来的内容, 都会进入堆内存, 通常会开辟空间产生地址
以下内存, 读者自行查阅
- 本地方法栈 :
- 寄存器 :
08-数组常见问题
-  ArrayIndexOufOfBoundsException : 数组索引越界异常 - 原因 : 访问了不存在的索引,如:循环条件超出数组长度,输出了负的数组下标或超出了数组length-1的下标值
 
-  NullPointerException : 空指针异常 - 原因 : 当引用数据类型变量, 记录到null之后, 代表跟堆内存的连接就被切断了
- 这时候还想访问堆内存数据, 就会出现空指针异常.
 
-  目标 : 今后看到这两个错误, 能够根据错误提示, 找到代码出错的位置, 并解决代码错误 
09-二维数组介绍
-  介绍 : 二维数组也是一种容器, 容器中存储的都是一维数组 - 理解 : 二维数组实际上是一维数组的嵌套
 
-  二维数组使用场景 : - 发现要操作的数据, 有多组
- 这多组数据, 又是一个整体, 建议使用二维数组进行维护
 
10-二维数组静态初始化
- 静态初始化格式 :
数据类型[][] 数组名 = new 数据类型[][]{
		{一维数组1},
		{一维数组2}
};
数据类型[][] 数组名 = {
		{一维数组1},
		{一维数组2}
};
---------------------------------------
int[][] arr = {
	{11,22,33},
	{44,55,66}
};
- 二维数组的元素访问 :
数组名[m索引][n索引];
m索引 : 要访问哪一个一维数组
n索引 : 要访问一维数组的哪一个元素
System.out.println(arr[1][0]);		// 44
11-二维数组遍历
- 思路 : 
  - 遍历二维数组, 获取到每一个一维数组
- 继续遍历一维数组, 获取具体的元素
 
- 代码 :
for(int i = 0; i < arr.length; i++){
	// arr[i] : 每一个一维数组
	for(int j = 0; j < arr[i].length; j++){
		System.out.println(arr[i][j]);
	}
}
12-二维数组动态初始化
- 格式 :
数据类型[][] 数组名 = new 数据类型[m][n];
m : 可以存储多少个一维数组
n : 每一个一维数组, 可以存储多少个元素
int[][] arr = new int[3][1];
二维数组可以存储3个一维数组, 每一个一维数组可以存储1个元素.
- 二维数组储存在内存的是数组首地址,申请的是以数组首地址开头的一片连续空间,内存的单位是字节.
13-方法介绍
- 介绍 : 方法 (method)在其他编程语言中被称为函数,function,功能等,其实本质都是一样的, 是一段具有独立功能的代码块, 不调用就不执行.
- 好处 : 
  - 提高代码的可阅读性 
    - 可以将挤在一起的臃肿代码, 按照功能进行分类管理
- 可以让代码结构更加清晰,利于程序维护
 
- 提高代码的复用性 
    - 原本需要重复编写的代码, 现在抽取到方法中, 只需要写一次, 对方法进行多次调用即可.
 
- 问题 : 方法是否可以提高程序的执行效率 ?
- 回答 : 不可以 !
 
- 提高代码的可阅读性 
    
14-方法的定义和调用格式
- 方法通用定义格式 :
public static 返回值类型 方法名 (参数列表) {
	方法体;
	return 结果数据;
}
public static : 目前暂时记住, 修饰符
返回值类型 : 跟方法返回的结果数据有关.
方法名 : 见名知意, 小驼峰命名法
参数列表 : 方法运行之前所需要的材料
方法体 : 方法中真正执行的逻辑代码
return :
			1. 结束方法
            2. 将结果返回给调用者.
- 定义方法的设计思路
1. 参数
	
		问题: 自己这方法中, 要使用的数据, 是否有灵活性的要求?
				需求: 设计一个方法, 打印10次HelloWorld --> 不要
				需求: 设计一个方法, 打印n次HelloWorld --> 要参数
				需求: 设计一个方法, 求三个小数的最大值 --> 要参数
				
		问题: 要参数的话, 要几个? 要什么类型的?
				需求: 设计一个方法, 求三个小数的最大值
						数量: 3个
						类型: double
						代码: double a, double b, double c
						
				需求: 设计一个方法, 从数组中找出最小值	
						数量: 1个
						类型: 数组
						代码: int[] arr
2. 返回值
		步骤1: 先写代码逻辑
		步骤2: 观察, 自己这个方法有没有结果产生
		
					没有结果: void
		
					public static void print(){
						for(int i = 1; i <= 10; i++){
							System.out.println("HelloWorld");
						}
					}
					
					有结果: 通过return语句返回, 并修改返回值类型
					
					public static int getMax(int a, int b){
						int c = a > b ? a : b;
						return c;
					}
- 方法的调用
1. 带返回值的调用
		1). 单独调用(不推荐)
		
				getMax(10,20);
		2). 赋值调用(推荐, 灵活)
				
				int max = getMax(10,20);
				
				System.out.println(max);
				
				if(max % 2 == 0){
					...
				}
				
				for(int i = 1; i <= max; i++){
					...
				}
				
		3). 输出调用(偶尔用)
		
				System.out.println(getMax(10,20));
				
2. 不带返回值的
		1) 只能单独调用
		
				print();
15-方法的常见问题
1. 方法不调用就不执行
2. 方法与方法之间是平级关系, 不允许嵌套定义
3. 方法的编写顺序, 和执行顺序无关
4. 如果一个方法的返回值类型为void, 表示此方法没有返回值, 可以省略return语句不写
		如果非要写的话, 只能写成 return; 
5. return语句下面, 不允许写代码, 因为执行不到, 属于无效代码.
6. 如果一个方法有具体的返回值(不是void), 一定要通过return语句带回结果数据, 无论什么情况下
		public static int getMax(int a, int b){
			if(a > b){
				return a;
			}else if(b > a){
				return b;
			}
			// 编译错误: 当前的两个return都被条件所控制, 编译期就认为, 两个条件要都是false, 此方法就没有返回值
		}
		
		
		public static int getMax(int a, int b){
			if(a > b){
				return a;
			}else if(b > a){
				return b;
			}else{
				return a;
			}
			
		}
16-方法重载 Overload
- 介绍 : 方法与方法之间的一种关系:同类同名不同参
- 目标1 : 能够独立识别出方法与方法之间是否是正确重载
在同一个类中, 方法名相同, 参数不同, 与返回值无关
	参数不同: 1. 个数不同   2. 类型不同   3. 顺序不同
- 目标2 : 能够理解方法重载带来的好处
不需要记忆过多繁琐的方法名字了
假设没有方法重载
	printInt(10);
	printString("abc");
	
有方法重载:
	println(10);
	println("abc");
	
	会根据实际参数的类型, 自己去匹配方法.
17–方法的参数传递
-  方法的参数传递基本数据类型 : 传递的是数据值 
-  方法的参数传递引用数据类型 : 传递的是地址值 
-  问:方法的参数传递中是传递的什么?  答:基本数据类型传递的是数值,引用数据类型传递的是地址 - 滑稽一下:是值,地址值也是值 ☺
 
本人水平有限,内容若有误和不足之处,欢迎各位读者指出与评论。










