Java学习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);
    }
}
打印结果为:

同实例: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);
    }
}
打印结果:

二、方法的参数传递
方法:必须在其所在类或对象调用才有意义。方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
问题:那么,Java的实参值如何传入方法呢?
答:Java中方法的传递只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。

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);
    }
}
打印结果为:

过程解析: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);
    }
}
打印结果:

过程解析: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.基本数据类型都是保存在栈内存中,引用对象在栈内存保存的是引用对象的地址,那么方法的传递实际就是传递值(这个值就是变量在栈内存中的值)
Java学习day9面向对象编程2-方法的可变个数的参数和方法的参数传递的更多相关文章
- Java学习day8面向对象编程2-类的属性和方法
		
一.类的属性 1.语法格式 修饰符 类型 属性名 = 初值 说明:修饰符private:该属性只能由该类的方法使用.在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类) 修饰符pu ...
 - Java学习之==>面向对象编程 Part2
		
一.封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结 ...
 - Java学习day7面向对象编程1-对象和类
		
一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...
 - JAVA学习:面向对象编程
		
"算法+数据结构=程序"是一句经典名言,这句话很直接的说明了程序的本质:处理数据.产生结果.即便是最简单的HelloWorld程序,我们也可以将字符串"HelloWorl ...
 - Java学习_面向对象编程
		
抽象类 一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰.因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译 ...
 - Java学习之==>面向对象编程  Part1
		
一.面向对象与面向过程 1.面向过程 角度是功能,以方法为最小单位,思考的是具体怎么做. 2.面向对象 角度是抽象,以类为最小单位,思考的是谁来做. 3.示例:“小明去上班” 面向过程 起床,刷牙洗脸 ...
 - 程序设计基础·Java学习笔记·面向对象(上)
		
Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...
 - [Java入门笔记] 面向对象编程基础(二):方法详解
		
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
 - 0028 Java学习笔记-面向对象-Lambda表达式
		
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
 
随机推荐
- php iconv函数转换出错问题
			
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
 - Azure IoT 技术研究系列4
			
上两篇博文中,我们介绍了将设备注册到Azure IoT Hub,设备到云.云到设备之间的通信: Azure IoT 技术研究系列2-设备注册到Azure IoT Hub Azure IoT 技术研究系 ...
 - LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图
			
瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...
 - wepy-wxss报错
			
慢慢积攒下wepy 的一些BUG吧 1.页面在page目录下明明删除了某个子页面文件,打开wepy却一直报错!wxml报错或者wxss报错,提示的页面我为了排错都直接delete掉了,还是报错???思 ...
 - SQL查询语句备忘录
			
有关于SQL查询的相关语句和语法的记录!备忘与复习用 1.SQL多表联合查询 select a.字段1,a.字段2,b,字段2 from 表1 a,表2 b where a.字段1 =b.字段1 2. ...
 - ESP8266-向物联网云平台发送数据--dweet
			
方法一: //向物联网平台发送数据 //发送数据格式: https://dweet.io/dweet/for/my-thing-name?hello=world 免费平台 //my-thing-nam ...
 - js原生高逼格插件
			
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
 - HTML5基础知识汇总(一)
			
一.HTML的开发工具和使用的浏览器 开发工具:记事本等文本编辑器,Atom.VisualStudioCode( VSCode).Brackets.Sublime text和Hbuider. 浏览器: ...
 - asp.net (web)选择文件夹 上传文件
			
1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...
 - ipcloud上传裁切图片
			
主页: <!doctype html> <html> <head> <meta charset="utf-8"> <meta ...