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{ ...
随机推荐
- js 动态时间
<script type="text/javascript"> function show_cur_times(){ //获取当前日期 var date_time = ...
- 基于http方式搭建YUM源服务器
基于http方式搭建YUM源服务器 (2012-09-21 11:59:14) 转载▼ 标签: yum linux lnmp lamp http 分类: Linux 为了方便公司80多台Linux服务 ...
- classloader加载class的流程及自定义ClassLoader
java应用环境中不同的class分别由不同的ClassLoader负责加载.一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoa ...
- 【前端】DOM操作
1 什么是DOM 全称 Document Object Model 文档对象模型. 一个web页面的展示,是由html标签组合成的一个页面,dom对象实际就是将html标签转换成了一个文档对象.可以通 ...
- 千呼万唤始出来——DataV私有部署功能
DataV的开发者们,今天进入你的用户中心,就会发现有一个小惊喜默默的在等待着你.那就是——私有部署功能上线啦! 一直以来私有部署都是一些有需要的小伙伴所望尘莫及的,毕竟高贵的身份摆在那里,现在不用再 ...
- centos搭建lamp环境参考(根据腾讯云实验室)
1.安装MYSQL 使用 yum 安装 MySQL: yum install mysql-server -y 安装完成后,启动 MySQL 服务: service mysqld restart 设置 ...
- 【PowerOJ1756&网络流24题】最长k可重区间集问题(费用流)
题意: 思路: [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a><i.b>,建立 ...
- MySQL与MongoDB的不同
数据存放的巨大不同
- 2014 ECML: Covariate-correlated lasso for feature selection (ccLasso)
今天看了一篇 ECML 14 的文章(如题),记录一下. 原文链接:http://link.springer.com/chapter/10.1007/978-3-662-44848-9_38 这篇文章 ...
- leetcode 40. 组合总和 II (python)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...