一、方法
1. 为什么要学习方法?
1)简化了代码;2)提高了代码的可读性;3)提高了代码的维护性;4)提高了代码的可扩展性;5)让我们开始从方法的实现者转变为方法的调用者,同时方法也是面向对象的基础。
2.方法的格式
[访问修饰符] 返回值类型 方法名称(参数1 参数2 参数3)[throws 异常]{
方法体
return语句;
}
**3.返回值类型 **: 八大基本数据类型和引用数据类型,类型必须和返回值的类型保持一致(也可以满足 类型转换和多态转型)
4.方法名:见名知意,一般是动词,满足驼峰命名,低头骆驼
5.参数类型:八大基本数据类型和引用数据类型
-
形参: 方法定义时候的参数
-
实参: 方法调用时候的参数
-
这里的参数变量只能够在方法体内有效
-
参数名: 这里必须见名知意,满足驼峰命名法,一般是名词,其实就是变量,只不过在局部有效,又称为局部变量
方法调用的时候参数实际传递的:
- 八大基本数据类型: 数值本身
- 引用数据类型: 地址
6.方法定义的位置:
- 主方法和自定义方法是平级关系
- 主方法定义在 类体之内
- 自定义方法定义在类体之内,方法体之外。
7.方法定义的三要素:
- 返回值类型 (结果)
- 参数列表 (原材料)
- 方法名 (供别人调用)
8.内存结构
- 栈区: 先进后出,类似于子弹夹, 压栈 弹栈 / 入栈 出栈
- 方法区 (代码区 、 永久区): 存放代码 、 方法 、 常量、 静态成员
9.方法重载
- 发生同一个类中
- 方法名称相同 [参数列表不同]
- 参数的个数,顺序,类型不同
- 方法重载和返回值类型以及访问权限修饰符,异常声明无关
- 重载也是多态的一种表现形式
- 重载的精确性原则,存在传入参数模糊时系统会报错。
10.递归的特点:
- 必须存在方法
- 自己调用自己 (方法不能够嵌套定义,但是可以嵌套调用)
- 递归一般要有出口(如果没有出口,一定会出现死递归,抛出 java.lang.StackOverflowError 栈内存溢出异常 )
- 构造方法不能够递归
二、数组
**1.**为什么要学习数组?
数组是一个能够存储多个变量的容器,学习数组的使用能够帮助我们更好的处理变量。
2.写法
1)一维数组
格式: 数据类型[] 数组名 = new 数据类型[数组的长度]; // Java写法
变式: 数据类型 数组名[] = new 数据类型[数组的长度]; // C语言写法
2)二维数组
格式: 数据类型[] [] 数组名 = new 数据类型[数组的长度] [数组的长度]; // Java写法
变式: 数据类型 数组名[] [] = new 数据类型[数组的长度] [数组的长度]; // C语言写法
数据类型[] 数组名 [] = new 数据类型[数组的长度] [数组的长度];
二维数组也可先new一个一维数组 **数据类型[] [] 数组名 = new 数据类型[数组的长度] []; **再分别new二维数组,每个一维数组中二维数组开辟的空间可不相等。
3.数组的初始化
1)静态初始化: 初始化的同时给数组的每一个元素赋值,不需要指明数组的长度,系统根据元素的个数动态计算数组的长度
格式一:数据类型[] 数组名 = {元素1, 元素2, 元素3, … , 元素n};
格式二:数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, 元素3, … , 元素n};
有了格式一为什么有格式二? --> 在传递参数的时候,如果是匿名数组必须使用格式二。
2)动态初始化: 初始化的同时由系统为每一个元素赋值,必须指明数组的长度,赋值的特点满足堆区的默认值特点
格式: 数据类型[] 数组名 = new 数据类型[数组的长度]; // Java写法
变式: 数据类型 数组名[] = new 数据类型[数组的长度]; // C语言写法
4.可变参数
格式: 参数类型… 变量名
可变参数的特点:
1.可变参数本质是数组
2.可变参数的 … 可以出现在 参数类型 和 变量名的 任意位置
3.可变参数必须出现参数列表的最后