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

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

.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-方法的可变个数的参数和方法的参数传递的更多相关文章

  1. Java学习day8面向对象编程2-类的属性和方法

    一.类的属性 1.语法格式 修饰符 类型 属性名 = 初值 说明:修饰符private:该属性只能由该类的方法使用.在同一类内可见.使用对象:变量.方法. 注意:不能修饰类(外部类)    修饰符pu ...

  2. Java学习之==>面向对象编程 Part2

    一.封装 封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结 ...

  3. Java学习day7面向对象编程1-对象和类

    一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...

  4. JAVA学习:面向对象编程

    "算法+数据结构=程序"是一句经典名言,这句话很直接的说明了程序的本质:处理数据.产生结果.即便是最简单的HelloWorld程序,我们也可以将字符串"HelloWorl ...

  5. Java学习_面向对象编程

    抽象类 一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰.因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译 ...

  6. Java学习之==>面向对象编程 Part1

    一.面向对象与面向过程 1.面向过程 角度是功能,以方法为最小单位,思考的是具体怎么做. 2.面向对象 角度是抽象,以类为最小单位,思考的是谁来做. 3.示例:“小明去上班” 面向过程 起床,刷牙洗脸 ...

  7. 程序设计基础·Java学习笔记·面向对象(上)

    Java程序设计基础之面向对象(上) (自适应学习进度而进行记录的笔记,希望有一些小小的用处吧(^∀^●)ノシ) (新人上路,望多指教,如有错误,望指正,万分感谢(o゚v゚)ノ) 目录 一.面向对象 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  9. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

随机推荐

  1. 安装suds,提示No module named 'client'

    最近在研究webservice,但是在线安装suds的时候提示No module named 'client' 提示没有client模块,提示这个错误主要还是因为没有安装client模块 在线安装cl ...

  2. Provider增删改查

    package com.fei.provider; import org.apache.ibatis.jdbc.SQL; import com.fei.domain.User; public clas ...

  3. CobaltStrike + Metasploit 联动使用

    本节的知识摘要: 通过 beacon内置的 socks功能将本地 Msf直接代入目标内网 借助 CobaltStrike的外部 tcp监听器通过 ssh隧道直接派生一个 meterpreter到本地 ...

  4. 简单的LCA

    这么久了才做LCA的题,以前是感觉很难不敢去尝试,现在学习了一番之后发现算法本身并不难.... 学习时看了这篇博文:https://www.cnblogs.com/JVxie/p/4854719.ht ...

  5. 微信小程序自定义底部导航栏组件+跳转

    微信小程序本来封装有底部导航栏,但对于想自定义样式和方法的开发者来说,这并不是很好. 参考链接:https://github.com/ljybill/miniprogram-utils/tree/ma ...

  6. UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]

    地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...

  7. bootstrap动态调用select下拉框

    html代码: <label for="classify" class="col-sm-2 control-label">填报部门:</lab ...

  8. Presenter 层

    后是 Presenter 层,它是处理业务逻辑和业务数据的,所以必须持有 Model 的引用,同时要将处理完的数据交给 View 层用于显示,也必须持有 View 的引用,那么,一开始我们就要把这两层 ...

  9. 20175221曾祥杰 实验三《敏捷开发与XP实践》

    实验三<敏捷开发与XP实践> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:曾祥杰 学号:20175221 指导教师:娄嘉鹏 实验日期:2019年4月30日 实验时间:13 ...

  10. xfs格式化、ext4格式化并指定inode区别

    [root@b ~]# mkfs.ext4 -N 90000000 /dev/sdb3 首先是mkfs.xfs的,重点是这几个:     -i size=512  : 默认的值是256KB,这里的设置 ...