成员方法传参机制(非常重要)

Parameter(参数)、Method(方法)、Exercise(练习)

基本数据类型的传参机制

看一下案例,将main中的值传递给类中对象

  1. /**
  2. * @ClassName MethodParameter
  3. * @Description TODO
  4. * @Author Orange
  5. * @Date 2021/4/13 13:42
  6. * @Version 1.0
  7. **/
  8. public class MethodParameter {
  9. public static void main(String[] args) {
  10. int a = 10;
  11. int b = 20;
  12. //创建AA 对象名字 obj
  13. BB obj = new BB();
  14. obj.swap(a, b); //调用swap
  15. System.out.println("main 方法a=" + a + " b=" + b); //a=10 b=20
  16. //小结:形参的改变是不会影响实参的值的
  17. }
  18. }
  19. class BB {
  20. public void swap(int a,int b){
  21. System.out.println("\na 和b 交换前的值\na=" + a + "\tb=" + b); //a=10 b=20
  22. // 完成了 a 和 b 的交换
  23. int tmp = a;
  24. a = b;
  25. b = tmp;
  26. System.out.println("\na 和b 交换后的值\na=" + a + "\tb=" + b); //a=20 b=10
  27. }
  28. }
  29. 程序运行结果:
  30. -------------------
  31. a b 交换前的值
  32. a=10 b=20
  33. a b 交换后的值
  34. a=20 b=10
  35. main 方法a=10 b=20
  36. -------------------

示意图

小结

  基本数据类型传递的是值(即值的拷贝),形参的任何改变不会影响实参!


引用数据类型的传参机制

看一下案例:

  • D 类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

  • D 类中编写一个方法test200,可以接收一个Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变

  1. /**
  2. * @ClassName MethodParameter02
  3. * @Description TODO
  4. * @Author Orange
  5. * @Date 2021/4/14 9:15
  6. * @Version 1.0
  7. **/
  8. public class MethodParameter02 {
  9. public static void main(String[] args) {
  10. //测试
  11. D d = new D(); //创建一个D类对象d
  12. int[] arr = {1, 2, 3}; //建立一个以为数组
  13. System.out.println("调用test100前,数组情况:");
  14. for(int i = 0; i < arr.length; i++) { //打印调用test100前 mian中数组
  15. System.out.print(arr[i] + "\t");
  16. }
  17. System.out.println();
  18. d.test100(arr); //调用方法test100(arr);
  19. System.out.println("调用test100后,数组情况:");
  20. //遍历数组
  21. for(int i = 0; i < arr.length; i++) { //打印调用test100后 mian中数组
  22. System.out.print(arr[i] + "\t");
  23. }
  24. System.out.println();
  25. }
  26. }
  27. class D {
  28. //D 类中编写一个方法test100,
  29. //可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
  30. public void test100(int[] arr) {
  31. arr[0] = 200;//修改元素
  32. //遍历数组
  33. System.out.println(" test100中数组情况");
  34. for (int i = 0; i < arr.length; i++) { //打印修改后test100中的数组
  35. System.out.print(arr[i] + "\t");
  36. }
  37. System.out.println();
  38. }
  39. }
  40. 程序运行结果:
  41. -----------------------
  42. 调用test100前,数组情况:
  43. 1 2 3
  44. test100中数组情况
  45. 200 2 3
  46. 调用test100后,数组情况:
  47. 200 2 3
  48. -----------------------

示意图

小结

  引用数据类型参数传递的是引用数据所在的地址值,由于相同的地址指向的是同一区域的值,对该区域的值进行修改后,在main中由于地址没变,指向的还是那片区域,但是其中的值已经在调用test100时被改变了,所以在打印main中数组时发生了变化,这就是与基本数据类型传递的区别。

  引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!


成员方法返回类型是引用类型应用实例

  编写类MyTools 类,编写一个方法可以打印二维数组的数据。

  编写一个方法copyPerson,可以复制一个Person 对象,返回复制的对象。克隆对象, 注意要求得到新对象和原来的

  对象是两个独立的对象,只是他们的属性相同

  1. /**
  2. * @ClassName MethodExercise01
  3. * @Description TODO
  4. * @Author Orange
  5. * @Date 2021/4/13 15:46
  6. * @Version 1.0
  7. **/
  8. import java.sql.SQLOutput;
  9. import java.util.Scanner;
  10. public class MethodExercise01 {
  11. public static void main(String[] args) {
  12. Info p = new Info();
  13. p.age = 100;
  14. p.name = "Orange";
  15. //创建tools
  16. MyTools tools = new MyTools();
  17. Info p2 = tools.copyPerson(p);
  18. //至此,p和 p2是Info对象,但是是两个对立的对象,属性相同
  19. System.out.println("p的属性 age = " + p.age + " 名字 = " + p.name);
  20. System.out.println("p的属性 age = " + p.age + " 名字 = " + p.name);
  21. //可以同对象之间相互比较看看是否为同一个对象
  22. System.out.println(p == p2); //False
  23. }
  24. }
  25. class Info{
  26. String name;
  27. int age;
  28. }
  29. class MyTools {
  30. public void printArray(int[][]arr) {
  31. for(int i = 0; i < arr.length; i++) {
  32. for(int j = 0; j < arr[i].length; j++) {
  33. System.out.println(arr[i][j]);
  34. }
  35. System.out.println();
  36. }
  37. }
  38. public Info copyPerson(Info p){
  39. //创建一个新的对象
  40. Info p2 = new Info();
  41. p2.name = p.name;//把原来对象的名字赋给p2.name
  42. p2.age = p.age;//把原来对象的年龄赋给p2.age
  43. return p2;
  44. }
  45. }
  46. 程序运行结果:
  47. -------------------------------
  48. p的属性 age = 100 名字 = Orange
  49. p的属性 age = 100 名字 = Orange
  50. false
  51. -------------------------------

Java笔记_成员方法传参机制的更多相关文章

  1. Java函数的传参机制

    一 最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了. 我就打算好好理一理java的传参机制,整理一番 二 很多人一听Java的传参,那一定会脱口而出,java ...

  2. uboot向kernel的传参机制——bootm与tags

    http://blog.csdn.net/skyflying2012/article/details/35787971 最近阅读代码学习了uboot boot kernel的过程以及uboot如何传参 ...

  3. [Java]_函数传参的疑惑与思考

    问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. void dfs(TreeNode node , int sum , ArrayList& ...

  4. 原来你是这样的JAVA[02]-包、传参、构造器

    一.包(package) 在java程序中,一个java源文件称为编译单元,以.java后缀命名.编译单元内可以有一个public类,类名必须与文件名相同.注意:每个编译单元只能有一个public类. ...

  5. 『Python × C++』函数传参机制学习以及对比

    一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...

  6. java调用py文件传参执行

    java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...

  7. 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递

    我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...

  8. java方法中,传参是传值还是传址问题(对比C语言、C#和C++)

    问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...

  9. Java基础 - 面向对象 - 类方法传参

    调用方法时可以给该方法传递一个或多个值,传给方法的值叫实参,在方法内部,接收实参的变量叫做形参,形参的声明语法与变量的声明语法一样.形参只在方法内部有效. Java中方法的参数主要有3种,分别为值参数 ...

  10. Java笔记_静态变量和实例变量的区别

    这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量. 1.Java里的全局变量 首先了解Java里的全局变量,也叫成员变量. 特点: (1).一个类中既不在方法体内,也不在程序块内定义的变 ...

随机推荐

  1. Java8Stream流2

    上期对stream流大致总结了一下,后面又做了一些练习,大家可以参考一下. 首先需要建一个 Product的实体类,后面会用到 @Data @AllArgsConstructor @NoArgsCon ...

  2. drf-day8——断点调试、认证.权限.频率的源码分析、基于APIView编写分页、全局异常处理

    目录 一.断点调试使用 二.认证,权限,频率源码分析(了解) 2.1 权限类的执行源码 2.2 认证源码分析 2.3 频率源码分析 2.4 自定义频率类(了解) 2.5 SimpleRateThrot ...

  3. 第三方模块:requests模块和openpyxl模块

    1.第三方模块的下载应由 第三方模块:别人写的模块 一般情况下功能都特别强大 我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块) 下载第三方模块的方式 1.pip工具 注意 ...

  4. OWASP 靶机下载

    OWASP靶机下载安装详细过程一. OWASP靶机下载二. VM虚拟机三. OWASP安装四. OWASP启动运行一. OWASP靶机下载下载地址:https://sourceforge.net/pr ...

  5. JZOJ 5460. 士兵训练

    题目 \(1\le n,q \le 2\cdot {10}^5,0\le b_i,l_i \le {10}^9,b_i \ge 1,1 \le S_i \le n\) \(Solution\) 这题很 ...

  6. Sequelize.js + Express.js 开发 API

    什么是 Sequelize 我们知道 Web 应用开发中的 Web 后端开发一般都是 Java.Python.ASP.NET 等语言.十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 Ja ...

  7. ASP.NET Core - 依赖注入(三)

    4. 容器中的服务创建与释放 我们使用了 IoC 容器之后,服务实例的创建和销毁的工作就交给了容器去处理,前面也讲到了服务的生命周期,那三种生命周期中对象的创建和销毁分别在什么时候呢.以下面的例子演示 ...

  8. 基于JavaScript的OpenGL 01 之Hello Triangle

    1. 引言 本文基于JavaScript语言,描述OpenGL(即,WebGL)的绘制流程,这里描述的是OpenGL的核心模式(Core-profile) 笔者这里不过多描述每个名词.函数和细节,更详 ...

  9. No.2.3

    PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心 手机屏幕小,网页宽度多数为100% 如何在电脑里面写代码边调试移动端网页效果? 谷歌模拟器 了解屏幕尺寸概念 屏幕尺寸:指的是屏幕对角线 ...

  10. Centos 6.5 iptables 端口白名单设置

    iptables -I INPUT -p tcp --dport 8888 -j DROPiptables -I INPUT -s 10.9.145.101 -p tcp --dport 8888 - ...