Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

一、方法的可变个数的参数.

  问题:我们能够打印的信息都是来源于方法的参数,也就是形参的传递。那如何要给方法传递不同的参数?

.1.采用数组形参来定义方法

public static void test(int a, String[] books);

2.采用可变个数形参来定义方法

public static void test(int a, String... books);

  说明:1.可变参数:方法参数部分指定类型的参数个数是可变多个

     2.声明方式:方法名(参数的类型名... 参数名)

     3.可变参数方法的使用与方法参数部分使用数组是一致的

     4.方法的参数部分有可变形参,需要放在形参声明的最后(如果一个方法有多个的形参,可变的形参(...这种的参数)一定要放在所有的参数的最后,例如printInfo(String a,int b,String... args))

实例:1.用数组形参来定义方法

public class Person{
    public void printInfo(String[] args){//用数组的方式来传递可变个数的参数,如果没有参数,就要定义一个空数组或者是null
        for(int i = 0; i < args.length; i++){
            System.out.println(args[i]);
        }
    }
    public static void main(String[] args){
        Person p = new Person();
        String[] ii = new String[]{"李白", "18"};
        p.printInfo(ii);
        String[] oo = new String[]{"唐朝", "诗人","酒鬼","剑仙"};
        p.printInfo(oo);
        
    }
}

打印结果为:

Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

同实例:2.使用可变个数形参来定义方法

public class Person{
    public void printInfo(String... args){//用Java特有的...方式来传递可变个数的参数,这种参数在使用时与数组的使用方式相同
        for(int i = 0; i < args.length; i++){
            System.out.println(args[i]);
        }
    }
    public static void main(String[] args){
        Person p = new Person();
        p.printInfo("杜甫","16","男");
        String[] ii = new String[]{"唐朝", "诗人","追星"};
        p.printInfo(ii);        
    }
}

打印结果:

Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

 

二、方法的参数传递

方法:必须在其所在类或对象调用才有意义。方法含有参数:

  形参:方法声明时的参数

  实参:方法调用时实际传给形参的参数值

 

问题:那么,Java的实参值如何传入方法呢?

答:Java中方法的传递只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

1.方法的参数传递之基本数据类型

  基本数据类型,值是保存在栈中。

实例1:

public class Test1 {
    public static void swap(int i){
        i = 6;
        System.out.println("swap方法中的参数i的值是:" + i);
    }
    
    public static void main(String args[]){
        int a = 0;
        swap(a);
        System.out.println("main方法中的参数a的值是:" + a);
    }
}

打印结果为:

Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

过程解析:1.代码先执行int a = 0,在栈中开辟了一块内存,地址为AD8500,存的值为0

     2.调用swap方法,执行int i部分,在栈中开辟一块内存,地址是AD8600,值就是从a那里复制过来的值0,

     3.调用swap方法体里面的代码,i = 6,把i在栈中的值0更改为6,最终i在栈中的值就是6

     4.总之,基本数据类型在参数的传递过程中,就是把实参的值复制值到形参上。

2.方法的参数传递之引用对象

  引用对象,值保存在堆中,栈中存的是对象在堆中的地址

public class DataSwap {
        public int a;
}



public class test {
    public static void swap(DataSwap ds1){
        ds1.a = 6;
        System.out.println("在swap方法中,ds1.a的值是:" + ds1.a);        
    }
    public static void main(String args[]){
        DataSwap ds = new DataSwap();
        System.out.println("调用swap方法之前,ds.a的值是:" + ds.a);
        swap(ds);
        System.out.println("调用swap方法之后,ds.a的值是:" + ds.a);
    }
}

打印结果:

Python学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递

过程解析:1.代码先执行DataSwap ds = new DataSwap();把new DataSwap()存到了堆内存中,地址BE2500。

     2.ds引用对象存到栈中,地址是AD9500,值是new DataSwap()对象在堆中的地址BE2500。

     3.调用swap方法,给ds1引用对象保存到栈中,地址是AD9600,存的值是来源于实参(ds)的值,也就是ds在栈中存的值,实际上就是之前new DataSwap()对象在堆内存中的地址。

     4.到第3步,ds和ds1其实都是指向同一个对象,这个对象就是在堆内存中地址是BE2500所保存的对象(new DataSwap()对象)。

 

总结:方法的参数传递

  1.如果方法的形参是基本数据类型,那么实参(实际的数据)向形参传递参数时,就是直接传递值,把实参的值复制给形参

  2.如果方法的形参是对象,那么实参(实际的对象),向形参传递参数时,也是把值给形参,这个值是实参在栈内存中的值,也就是引用对象在堆内存中的地址

  3.基本数据类型都是保存在栈内存中,引用对象在栈内存保存的是引用对象的地址,那么方法的传递实际就是传递值(这个值就是变量在栈内存中的值)

上一篇:linux day9 文件查找命令


下一篇:Java学习笔记Day9