方法
1.1 方法的概念及作用
-
概念:方法,也叫函数,但是一般在java中都叫方法,可以## 标题看成是一个可以完成独立功能的代码块,可以反复使用,每次使用都是独立的!存在于类的结构体
-
作用:反复使用。每次使用都是独立的
1.2 认识方法
public static void main(String[] args){
add(1,2);//调用add方法
}
public static void add(int a,int b){//方法(函数):一个设计好的功能代码块,可以反复的使用
int sum = a+b;//功能语句,求和
System.out.println(sum);//输出计算结果
}- public static修饰符
a) 修饰给与特殊意义 - void:此处位置返回值类型,void 表示没有返回值
- main:方法名字
- (String[] args) : 一个形式参数,String[] 数据类型 args形式参数名字
a) 形式参数: 本质没有值的;可以看成是有值的,在方法的内部完成功能的设计 - {}:方法的结构体
a) 完成功能的设计
- public static修饰符
*/
5) {}:方法的结构体
a) 完成功能的设计
6) 存在于类的结构体
1.3 方法的语法:
返回值类型 方法名字( 形式参数 ){
}
- 返回值: 必须有
- 方法名字:必须有
- 小括号: 必须有
- 形式参数:根据需要设定,也可以没有形式参数
a. 方法可以看成完成功能的代码块
b. 举例说明:代码块看成豆浆机
a) 豆浆机会有入口[ 说明 :放绿豆 黄豆 豆豆 ] - 大括号: 必须有: 但是功能语句可以任意写
1.5 方法的使用
- 使用方法的三种方式
- 方法有static修饰:类名.方法名+参数列表[个数,顺序,类型必须一致]
- 方法没有static修饰:对象名.方法名+参数列表[个数,顺序,类型必须一致]
- 方法在同一个类中:方法名+参数列表[个数,顺序,类型必须一致]
a) +参数列表: 传入对应类型的数据
- 注意事项:
- 对于方法的使用者而言,无需关心方法内部的实现
- 同一个类中:静态方法不能调用非静态的方法
- 同一个类中:非静态方法可以调用静态方法[ 自己读 测试]
1.7 方法签名: - 需求:在同一个;类设计一个方法完成二个整数求和
- 思考:在一个类中是如何找到的一个方法
- 概念:方法名字+参数列表[类型,个数,顺序:必须一致]
public static void main(String[] args){
int a = 1;//声明一个变量
int b = 2;//声明一个变量
int sum=add(a,b);//声明一个变量来储存调用方法的值
}
static viod add(int a,int b){
//static void add(int a,int b){//方法签名:方法名和形式参数不能同时相同
//static void add(int a,int b,int c){方法重载:方法名相同,参数列表不同
int sum=a+b;
System.out.println(sum);
}
1.8 方法重载:
- 思考:在同一个类中如果在设计一个方法求两个整数的和会怎么样?
- 概念:在同一个类中,方法名字相同,参数列表不同
1.9 方法return
① 方式:将方法运算的结果返回给方法调用着,方法内部将运算结果使用语句:
return 值/变量/表达式;
② 方法返回值的位置,必须写与方法内部返回值的数据一致的数据类型
③ 注意:返回的是数据,不是变量或者表达式
④ 方法返回值的结果,怎么使用?
注意事项:有返回值方法,一定要有对应返回语句
public static void main(String[] args){
int a = 1;//声明一个变量
int b = 2;//声明一个变量
int sum=add(a,b);//声明一个变量来储存调用方法的值
System.out.println(sum);
}
//方法return
static int add(int a,int b){//必须返回与int一致的数据类型
int sum=a+b;
return sum;//使用完成之后,如果有结果值(返回的是值),返回给方法使用者
}
结论:
①如果一个方法的返回类型不是void,那么要求[不管方法里面做了什么事情]
都必须返回一个和返回值类型匹配的值
②对于结构体语句中写返回值:编译检查语法,只看结构不看值:
结构体中写了返回值不一定执行的到,编译语法会不通过!
1.10方法使用的常见问题
- 忽略方法每次使用都是一次独立的使用
- 对于执行执行顺序变得模糊
- 方法调用错误,只使用了方法名字!缺少参数列表
- 有返回值的方法使用
a) 使用了方法但是没有使用方法的结果值【 打印不出来结果 】
b) 主方法中已经使用方法,打印语句括号中再次调用方法使用结果【方法功能重复使用】 - 没返回值的方法使用
a) 将没有返回值的方法【void】方法调用放入打印语句小括号
数组
概念:数组可以理解成在计算机中的多个连续的存储空间,里面可以按顺序存放多个类型相同的数据。
//数组语法:数据类型[] 数组名 = new 数据类型[长度];
public static void main(String[] args){
int[] arr = new int[9];//声明了一个int类型的数组,数组名arr长度为9
arr[0] = 1;
arr[1] = 2;
arr[0] = 11;//一个存储空间只会存一个值
System.out.println(arr[0]+"-----"+arr[1]);
System.out.println(arr.length);//数组长度属性*****数组名.length
- 数组名 : 数组的名字
- 数组元素 :就是存放在数组里面的数据
- 数组索引 :就是数组里面连续存储空间的编号,从0开始
- length :数组的属性长度 数组名.length拿到数组的长度
创建数组的方式
- 动态创建之声明的同时赋值
数据类型 [] 数组变量名 = new 数据类型[数组长度];
int[] arr = new int[10];
2.3 如何使用
对于计算机内存存储空间的使用最重要的就是存值取值 - 存值
(1) 数组名[索引位置] = 值; - 取值
(1) 数组名[索引位置]
(2) 数组遍历
int[] arr = new int[5];//int[]数据类型,arr看成一个变量名,持有地址值,new是关键字
arr[0]=12;//存入12
System.out.println(arr[0]);//输出数组中的值
System.out.println(arr);//[I@1db9742地址值
2.4 JVM存储数据分析
JVM的内存分析-》帮助我们理解代码中引用类型数据
- 堆:可以理解为凡是new 出来的东西都放在这里面,堆内存可以被虚拟机动态的分配内存大小,无需事先告诉编译器的数据的大小、生命周期等相关信息
- 栈:主要存放一些变量容器名 (例如局部变量名,还可以存放局部变量 基本类型 数据值),栈内存被要求存放在其中的数据的大小、生命周期必须是已经确定的
- 图例
2.5 数组特点
-
数据类型限定了数组可以存放的数据类型
-
一个数组可以存储多个元素
-
一旦数组对象被创建好,那么其长度就固定不变了
-
动态创建好数组之后,会自动分配默认值,和数组中的元素类型有关(类似之前成员变量的默认值)
2.6 常见问题 -
数组索引越界【索引有哪些,索引的范围?(所有数组都有一个length属性)】
-
空指针错误
-
如果有返回值,不知道return写在哪里
int[] arr = {1,1,3,4,6,7};//0~5
System.out.println(arr.length);//数组的长度
System.out.println(arr);//1.数组越界【索引,多了或者少了,不在一个数组的索引范围】 //System.out.println(arr[arr.length]);//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 //遍历 for(int i = 0;i<=arr.length;i++){//没有arr.length-1就会出现索引越界 System.out.println("索引位置:"+i); System.out.println(arr[i]); } //空指针异常 int[] ar = null;//arr根本就没有指向一个数组【数组不存在】 //编译不报错:只看类型不看值,不会看到底有没有数组,但是运行一定会看数组在不在【看是否有值】 System.out.println(ar.length); String str = null;
}
//如果有返回值,不知道return写在哪里】
static int[] getArr(){
return new int[10];
}
2.7 获得数组的其他语法补充
- 动态创建之先声明后赋值
数据类型 [] 数组变量名;
int[] arr;
数组变量名 = new 数据类型[数组长度];
arr = new int[10]; - 动态创建之声明的同时赋值
数据类型[] 数组名 = new 数据类型[数组长度]; - 静态创建之复杂写法
- 推荐写法:
a. 声明的同时赋值
数据类型 [] 数组变量名 = new 数据类型[] {多个以英文逗号分隔的数据};
int[] arr = new int[]{1,2,3,4,5,6,7}
b. 先声明后赋值
数据类型 [] 数组变量名;
数组变量名 = new 数据类型[] {多个以英文逗号分隔的数据}; - 不推荐写法
a. 声明的同时赋值
数据类型 数组变量名 [] = new 数据类型[] {多个以英文逗号分隔的数据};
b. 先声明后赋值
数据类型 数组变量名 [];
数组变量名 [] = new 数据类型[] {多个以英文逗号分隔的数据};
- 静态创建简写方式
-
声明的同时赋值
数据类型[] 数组变量名 = {多个以英文逗号分隔的数据};//接下来学习中最常用 -
先声明后赋值[编译器不允许,错误写法]
数据类型[] 数组变量名;
数组变量名 = {多个以英文逗号分隔的数据};
打印数组
设计一个方法,打印传入int数组中的所有元素,打印的格式:[11,22,44,55] -
定义一个方法print,方法参数修改为int 数组(变量名为arr)
-
方法里 使用 for循环 遍历数组,使用System.out.println打印
-
main方法里创建一个数组,然后调用方法print方法
-
打印结果换行了,但是我们要求打印一行,所以使用System.out.print
-
但是我们要求打印用 逗号 分割,所以System.out.print(arr[i]+”,”)
-
前后要求还有个 中括号,所以我们加上打印 [ 和 ]
int[] arr = {4,4,23,423,42,34};//声明了一个int类型的数组,数组名arr长度为6printArr(arr);
}
//设计一个方法【打印数组】[1,2,3,4,5,6,7,8]
static void printArr(int[] arr){
System.out.print("[");
for(int i = 0;i<=arr.length-1;i++){//判断语句
if(i==arr.length-1){//判断如果为最后一个直接打印
System.out.print(arr[i]);
}else{
System.out.print(arr[i]+",");//如果不为最后一个则打印逗号
}
}
System.out.print("]");//结束打印[}
- 方法参数传递[掌握]
4.1 什么是方法参数传递
-
概念:在使用方法的时候,传入值或者变量,传递的到底是什么?
-
值传递:方法传递的是值
a) 形式参数类型是基本数据类型
b) 基本类型数据传递的是值 -
值引用:方法传递的是值得引用
a) 形式参数类型是引用数据类型
b) 引用传递其实传的是地址,形式参数类型是引用数据类型或数组。
c) 实际参数(数据)是对象(或数组),这时实际参数与形式参数指向同一个地址
d) 在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被 保留了下来,所以方法执行中形式参数的改变将会影响实际参数。 -
值传递示例: 定义一个change 方法 和 int 形参
-
值引用再看一个示例,定义一个change 方法 和 int 数组 的形参,交换数组中前面2个元素
-
注意:方法调用时,实际参数把它的值传递给对应的形式参数,相当于拷贝了一份值给形式参数, 所以方法执行中形式参数值的改变不影响实际参数的值。
a) 基本数据不影响原来的值
b) 引用数据不影响原来的地址值:
引用地址,引用的值,如果被改变,原来引用的的值所引用的值也会被改变,
因为都是同一个引用
public static void main(String[] args){
int a = 10;//基本数据类型
int[] arr = {66};//引用数据类型
System.out.println(a);//10
System.out.println(arr[0]);//66
//-------------------------------------
changeData(a);
changeData(arr);System.out.println(a);//10 System.out.println(arr[0]);//99
}
static void changeData(int a){
//System.out.println(“int-”+a);//10
a = 55;
}
static void changeData(int[] a){
//System.out.println(“int[]-”+a);//[I@15db9742-----传递地址值
a[0] = 99;
}