一、可变参数
package com.exmaple.ObjectOriented;
/**
* 方法参数
*/
public class ParameterList {
/*
1、方法的结构
修饰符 返回值 方法名(参数类型 参数名){代码块}
2、方法参数类型可以是基本类型和引用类型
*/
private static void method(int a, String b, Person person){
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("person = " + person);
}
/*
可变参数
1、String... name相当于一个数组String[] name
2、可变参数的写法比数组写法更直观简洁
*/
private static void method2(String... name){
}
private static void method3(String[] name){
}
public static void main(String[] args) {
method(23,"张三", new Person());
//可变参数写法
method2("张三", "李四", "王五", "小明");
method3(new String[]{"张三", "李四", "王五", "小明"});
}
}
class Person{
private Integer age;
private String name;
}
二、参数传递
- 基本类型
package com.exmaple.ObjectOriented;
public class ValuePropagation {
private static int method(int age){
if(age < 20){
age = 23;
}
return age;
}
/*
java中只有值传递,没有引用传递
1、基本类型传递具体的值,是值的复制,
也就说会将传入方法的基本类型参数的值拷贝一份给方法的参数
2、引用类型传递对象在内存中的地址即地址值
*/
public static void main(String[] args) {
int age = 16;
int output = method(age);
System.out.println("age = " + age); //16
System.out.println("output = " + output); //23
}
}
- 我在main里定义了变量age,并将它作为参数传递给方法method
- method方法里会对参数age进行重新赋值
结论:但是方法内部的操作,对外部变量age并没有影响,因为参数传递只是值得拷贝
- 再来看引用类型的传递
package com.exmaple.ObjectOriented;
public class ValuePropagation {
private static void method(String name){
if(name == null || name.isBlank()){
throw new IllegalArgumentException("invalid argument name: " + name);
}
name = "李四";
}
public static void main(String[] args) {
String name = "张三";
method(name);
System.out.println(name); //张三
}
}
我们看看程序做了什么:
- 找到程序得入口main方法
- 创建一个String类型的对象 "张三" 并将变量name指向它,java给对象"张三" 分配了地址值,由name保存
- 调用method方法,将name保存得地址值拷贝一份给了方法得参数name,也就是说一开始方法得参数name是指向对象 "张三"
- method方法内部创建了一个String类型得对象 "李四" 并将分配得地址值交给了方法参数name保存
- 看看数组类型
package com.exmaple.ObjectOriented;
import java.util.Arrays;
public class ValuePropagation {
private static void method(String[] names){
names[0] = "中国";
}
public static void main(String[] args) {
String[] names = {"张三","李四","王五"};
method(names);
System.out.println(Arrays.toString(names)); //[中国, 李四, 王五]
}
}
- 创建一个数组并将对象地址值给names保存,数组下标为0得元素指向内存中得对象 "张三",也就是说数组下标为0得元素保存了 "张三" 得地址值,以此类推
- 调用method方法,将变量names保存得地址值传递给该方法
- method方法里,创建一个String类型的对象 "中国",通过方法参数names保存得地址值找到对应的数组对象,将对象 "中国" 分配的地址值给给数组对象下标为0得元素
所以最后打印得结果会被改变