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{ ...
随机推荐
- linux tomcat 中文文件上传乱码
找到tomcat文件夹下的conf/server.xml,在connector节点下新增URIEncoding="utf-8"参数 <Connector connection ...
- Django【第20篇】:Ajax
初始Ajax 一.Ajax准备知识:json 说起json,我们大家都了解,就是python中的json模块,那么json模块具体是什么呢?那我们现在详细的来说明一下 1.json(Javascrip ...
- pyserial库-串口通讯模块
pySerial 封装了串口通讯模块,支持Linux.Windows.BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mono). ...
- 数据结构--排序--直接插入(python)
... def insertSort(nums): length = len(nums) for i in range(1,length): x = nums[i] for j in range(i, ...
- Task5.PyTorch实现L1,L2正则化以及Dropout
1.了解知道Dropout原理 深度学习网路中,参数多,可能出现过拟合及费时问题.为了解决这一问题,通过实验,在2012年,Hinton在其论文<Improving neural network ...
- Quantitative Startegies for Achieving Alpha(二)
Chapter 3 The Day-To-Day Drivers Of Stock Market Returns Summary: (1) Earning growth is the primary ...
- pycharm2017版本永久激活
亲测有效,为了以后方便查看,就复制粘贴了一下 声明:转自https://blog.csdn.net/qq_34173491/article/details/81157519 目前比较好用的Python ...
- BigDecimal.setScale 处理java小数点[转]
BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余 ...
- Amaze ui tree 刷新数据
最近在做代码生成器,界面用的是Amaze ui ,但是在用tree的时候发现数据绑定不会自动更新,去百度.谷歌查也没有查到,没办法只能自己做一个demo 在这贴上效果图 demo 下载地址https: ...
- 取得所有网卡的MAC地址,包括禁用的
先在nuget包中添加System.Management.Automation引用. 然后下面就是代码了. using System;using System.Collections.ObjectMo ...