java基础days05 --- 方法参数

一、可变参数

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
    }
}
  1. 我在main里定义了变量age,并将它作为参数传递给方法method
  2. 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); //张三
    }

}

我们看看程序做了什么:

  1. 找到程序得入口main方法
  2. 创建一个String类型的对象 "张三" 并将变量name指向它,java给对象"张三" 分配了地址值,由name保存
  3. 调用method方法,将name保存得地址值拷贝一份给了方法得参数name,也就是说一开始方法得参数name是指向对象 "张三"
  4. 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)); //[中国, 李四, 王五]
    }

}
  1.  创建一个数组并将对象地址值给names保存,数组下标为0得元素指向内存中得对象 "张三",也就是说数组下标为0得元素保存了 "张三" 得地址值,以此类推
  2. 调用method方法,将变量names保存得地址值传递给该方法
  3. method方法里,创建一个String类型的对象 "中国",通过方法参数names保存得地址值找到对应的数组对象,将对象 "中国" 分配的地址值给给数组对象下标为0得元素

所以最后打印得结果会被改变

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值