JavaBasis
- 0、系统默认初始值
- 1、方法
- 2、方法重载
0、系统默认初始值
类型 初始值
byte、short、int ——> 0
char ——> ‘\u0000’(\u代表以 u16 进行编码)
long ——> 0L
float ——> 0.0F
double ——>0.0
boolean ——> false
引用数据类型 ——> null
1、方法
- 概述 :把重复且有效的代码进行抽取,抽取的形式称为~
- 格式 :
修饰符 返回值类型 方法名(参数列表){
方法体;
(return 返回值;)
}
解析 :
修饰符 :public static
返回值类型 :给定对应返回值类型来接收返回值;
如果没有返回值,则用 void 表示;
方法名 :标识符
参数列表 :由参数类型、参数个数以及参数顺序决定的
方法体 :重复且有效的代码
return :把方法的返回值进行返回;结束方法
//没有返回值的方法
public void add(){
int i = 1;
int j = 1;
System.out.println(i + j);
}
//有返回值的方法
public int add(int i, int j){
return i + j;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 应用 :
1) 方法只有调用才会执行
2) 抽取 / 定义方法,两个明确 :
Ⅰ、方法返回值类型
Ⅱ、参数列表
Ⅲ、return 两个功能 :① 结束方法; ② 把返回值进行返回
Ⅳ、考虑参数所有取值情况,都要提供对应的返回值的情况
2、方法重载
- 概述 : 当一个类中。方法名一致,参数列表不一致
java 根据方法签名(方法名和参数列表共同作用)能唯一确定方法
参数列表 :类型、数量、顺序 - 调用重载方法时 :
a、如果提供精确匹配方法就进行精确匹配
b、如果没有提供精确匹配方法进行相对精确匹配;如果提供多个相对精确匹配的方法,无法调用到方法就会报错
c、尽量提供精确匹配
不符合方法重载 :
//不符合方法重载的
//当方法名和参数列表相同而返回值不同时,编译报错
public void add(int i){}
public int add(int i){return 0;}
//当方法名和参数列表相同而修饰符和返回值不同时,编译报错
private void add(){}
public int add(){return 0;}
//当方法名不相同时,不属于方法重载
public void add(){}
public void add1(){}
public int add2(int i){}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
符合方法重载 :方法名相同,参数列表不同;方法重载与返回值类型和修饰符无关
//符合方法重载
//方法名相同,参数列表不同;方法重载与返回值类型和修饰符无关
public void add(){}
public void add(int i){}
public void add(double i, int j){}
public double add(int i, double j){return i + j;}
public int[] add(int[] arr){return arr;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
精确匹配与相对精确匹配 :如下图,若存在两个重载的 add 方法时,如在 main() 方法中调用 add 方法,并传入两个 int 类型的值时,由于没有 add(int i,int j)方法进行精确匹配,所以进行相对匹配;由于 int 类型可以提升为 double 类型,所以会同时匹配到下面两个方法,就会编译错误
6. 方法传值 :
a、当实参是基本数据类型时,传递值就是值得拷贝
b、当实参是引用数据类型时,传递就是地址值的拷贝;当根据拷贝的地址值可以找到原堆内存,那么所做的改变就会有影响;如果没有找到,则不会有影响
7. 形参和实参
形参是指定义方法时,参数列表中的参数;
实参是指在调用方法时,所传入的实际数据;
形参时局部变量,作用域在方法体内,出了方法后不可见;形参可以用 final 修饰,被 final 修饰后的形参被赋初始值后,值就不可改变
案例一 :
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5};
System.out.println(arr);
change01(arr1);
System.out.println(Arrays.toString(arr1));
}
public static void change01(int[] arr){
arr = new int[3];
System.out.println(arr);
arr[0] = 10;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
结果 :
实参数组地址值 : [I@45ee12a7
形参数组地址值 : [I@330bedb4
[1, 2, 3, 4, 5]
- 1
- 2
- 3
原因 :当实参是引用数据类型时,传递就是地址值的拷贝;
当调用 change01(arr) 方法时,将地址值拷贝给形参,执行 arr = new int[3]; 时,将新地址值赋给形参 arr;当执行 arr[0]=10; 时,将具有新地址形参 arr 的第一个数改为 10,而新地址并不指向原地址,所以原地址中的内容不会有影响;所以 main() 方法里 arr 数组地址值所指向的原堆内存不受影响,即 arr 里的值不会改变
案例二 :
public static void main(String[] args) {
int[] arr2 = {1,2,3,4,5};
System.out.println(arr);
change02(arr2);
System.out.println(Arrays.toString(arr2));
}
public static void change02(int[] arr){
System.out.println(arr);
arr[0] = 10;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
结果 :
实参数组地址值 : [I@45ee12a7
形参数组地址值 : [I@45ee12a7
[10, 2, 3, 4, 5]
- 1
- 2
- 3
原因 :当实参是引用数据类型时,传递就是地址值的拷贝;
当调用 change02(arr) 方法时,将地址值拷贝给形参,当执行 arr[0]=10; 时,将形参 arr 的第一个数改为 10,因为形参 arr 指向的地址值能找到原堆内存,所以做出的改变会对原数组内容有影响; main() 方法里 arr 数组内容被改变