【大数据】学习笔记 1 Java SE 第5章 面向对象基础(上) 5.5 参数问题

心已赠人 2024-03-22 11:13 113阅读 0赞

【大数据】学习笔记

文章目录

    • 【大数据】学习笔记
      • 1 Java SE
        • 第5章 面向对象基础(上)
          • 5.5 参数问题
            • 5.5.1 特殊参数之一:可变参数
            • 5.5.2 方法的参数传递机制

在这里插入图片描述

1 Java SE

第5章 面向对象基础(上)
5.5 参数问题
5.5.1 特殊参数之一:可变参数

JDK1.5之后,当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变参数。可变参数的格式:

  1. 【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){ }

可变参数的特点和要求:

(1)一个方法最多只能有一个可变参数

(2)如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个

(3)在声明它的方法中,可变参数当成数组使用

(4)其实这个书写“≈”

  1. 【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型[] 形参名){ }

只是后面这种定义,在调用时必须传递数组,而前者更灵活,既可以传递数组,又可以直接传递数组的元素,这样更灵活了。

【1】方法只有可变参数

案例:求n个整数的和

  1. package com.dingjiaxiong.test05;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: NumberTools
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:10
  7. */
  8. public class NumberTools {
  9. int total(int[] nums) {
  10. int he = 0;
  11. for (int i = 0; i < nums.length; i++) {
  12. he += nums[i];
  13. }
  14. return he;
  15. }
  16. int sum(int... nums) {
  17. int he = 0;
  18. for (int i = 0; i < nums.length; i++) {
  19. he += nums[i];
  20. }
  21. return he;
  22. }
  23. }

测试类:

  1. package com.dingjiaxiong.test05;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: TestVarParam
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:11
  7. */
  8. public class TestVarParam {
  9. public static void main(String[] args) {
  10. NumberTools tools = new NumberTools();
  11. System.out.println(tools.sum());//0个实参
  12. System.out.println(tools.sum(5));//1个实参
  13. System.out.println(tools.sum(5, 6, 2, 4));//4个实参
  14. System.out.println(tools.sum(new int[]{
  15. 5, 6, 2, 4}));//传入数组实参
  16. System.out.println("------------------------------------");
  17. System.out.println(tools.total(new int[]{
  18. }));//0个元素的数组
  19. System.out.println(tools.total(new int[]{
  20. 5}));//1个元素的数组
  21. System.out.println(tools.total(new int[]{
  22. 5, 6, 2, 4}));//传入数组实参
  23. }
  24. }

在这里插入图片描述

【2】方法包含非可变参数和可变参数

  • 非可变参数部分必须传入对应类型和个数的实参;
  • 可变参数部分按照可变参数的规则传入0~n个对应类型的实参或传入1个对应类型的数组实参;

案例:

n个字符串进行拼接,每一个字符串之间使用某字符进行分割,如果没有传入字符串,那么返回空字符串””

  1. package com.dingjiaxiong.test05;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: StringTools
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:12
  7. */
  8. public class StringTools {
  9. String concat(char seperator, String... args) {
  10. String str = "";
  11. for (int i = 0; i < args.length; i++) {
  12. if (i == 0) {
  13. str += args[i];
  14. } else {
  15. str += seperator + args[i];
  16. }
  17. }
  18. return str;
  19. }
  20. }

测试类:

  1. package com.dingjiaxiong.test05;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: StringToolsTest
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:13
  7. */
  8. public class StringToolsTest {
  9. public static void main(String[] args) {
  10. StringTools tools = new StringTools();
  11. System.out.println(tools.concat('-'));
  12. System.out.println(tools.concat('-', "hello"));
  13. System.out.println(tools.concat('-', "hello", "world"));
  14. System.out.println(tools.concat('-', "hello", "world", "java"));
  15. }
  16. }

在这里插入图片描述

5.5.2 方法的参数传递机制

方法的参数传递机制:实参给形参赋值,那么反过来形参会影响实参吗?

  • 方法的形参是基本数据类型时,形参值的改变不会影响实参;
  • 方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值。

    • 注意:String、Integer等特殊类型容易错

【1】形参是基本数据类型

案例:编写方法,交换两个整型变量的值

  1. package com.dingjiaxiong.test05.param;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: PrimitiveTypeParam
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:15
  7. */
  8. public class PrimitiveTypeParam {
  9. void swap(int a, int b) {
  10. //交换两个形参的值
  11. int temp = a;
  12. a = b;
  13. b = temp;
  14. }
  15. public static void main(String[] args) {
  16. PrimitiveTypeParam tools = new PrimitiveTypeParam();
  17. int x = 1;
  18. int y = 2;
  19. System.out.println("交换之前:x = " + x + ",y = " + y);//1,2
  20. tools.swap(x, y);//实参x,y是基本数据类型,给形参的是数据的“副本”,调用完之后,x与y的值不变
  21. System.out.println("交换之后:x = " + x + ",y = " + y);//1,2
  22. }
  23. }

在这里插入图片描述

【2】形参是引用数据类型

  1. package com.dingjiaxiong.test05.param;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: MyData
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:16
  7. */
  8. public class MyData {
  9. int x;
  10. int y;
  11. }
  12. package com.dingjiaxiong.test05.param;
  13. /**
  14. * @Projectname: BigDataStudy
  15. * @Classname: ReferenceTypeParam
  16. * @Author: Ding Jiaxiong
  17. * @Date:2023/4/24 16:16
  18. */
  19. public class ReferenceTypeParam {
  20. void swap(MyData my) {
  21. //形参my是引用数据类型,接收的是对象的地址值,形参my和实参data指向同一个对象
  22. //里面交换了对象的两个实例变量的值
  23. int temp = my.x;
  24. my.x = my.y;
  25. my.y = temp;
  26. }
  27. public static void main(String[] args) {
  28. ReferenceTypeParam tools = new ReferenceTypeParam();
  29. MyData data = new MyData();
  30. data.x = 1;
  31. data.y = 2;
  32. System.out.println("交换之前:x = " + data.x + ",y = " + data.y);//1,2
  33. tools.swap(data);//实参是data,给形参my的是对象的地址值,调用完之后,x与y的值交换
  34. System.out.println("交换之后:x = " + data.x + ",y = " + data.y);//2,1
  35. }
  36. }

在这里插入图片描述

【3】形参是数组

  1. package com.dingjiaxiong.test05.param;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: ArrayTypeParam
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:17
  7. */
  8. public class ArrayTypeParam {
  9. void sort(int[] arr) {
  10. //给数组排序,修改了数组元素的顺序,这里对arr数组进行排序,就相当于对nums数组进行排序
  11. for (int i = 1; i < arr.length; i++) {
  12. for (int j = 0; j < arr.length - i; j++) {
  13. if (arr[j] > arr[j + 1]) {
  14. int temp = arr[j];
  15. arr[j] = arr[j + 1];
  16. arr[j + 1] = temp;
  17. }
  18. }
  19. }
  20. }
  21. void iterate(int[] arr) {
  22. //输出数组的元素,元素之间使用空格分隔,元素打印完之后换行
  23. //这个方法没有修改元素的值
  24. for (int i = 0; i < arr.length; i++) {
  25. System.out.print(arr[i] + " ");
  26. }
  27. System.out.println();
  28. }
  29. public static void main(String[] args) {
  30. ArrayTypeParam tools = new ArrayTypeParam();
  31. int[] nums = {
  32. 4, 3, 1, 6, 7};
  33. System.out.println("排序之前:");
  34. tools.iterate(nums);//实参nums把数组的首地址给形参arr,这个调用相当于输出nums数组的元素
  35. //对数组的元素值没有影响
  36. tools.sort(nums);//对nums数组进行排序
  37. System.out.println("排序之后:");
  38. tools.iterate(nums);//输出nums数组的元素
  39. //上面的代码,从头到尾,堆中只有一个数组,没有产生新数组,无论是排序还是遍历输出都是同一个数组
  40. }
  41. }

在这里插入图片描述

【4】形参指向新对象

  1. package com.dingjiaxiong.test05.param;
  2. /**
  3. * @Projectname: BigDataStudy
  4. * @Classname: AssignNewObjectToFormalParam
  5. * @Author: Ding Jiaxiong
  6. * @Date:2023/4/24 16:19
  7. */
  8. public class AssignNewObjectToFormalParam {
  9. void swap(MyData my) {
  10. my = new MyData(); //这里让my形参指向了新对象,此时堆中有两个MyData对象,和main中的data对象无关
  11. int temp = my.x;
  12. my.x = my.y;
  13. my.y = temp;
  14. }
  15. public static void main(String[] args) {
  16. //创建这个对象的目的是为了调用swap方法
  17. AssignNewObjectToFormalParam tools = new AssignNewObjectToFormalParam();
  18. MyData data = new MyData();
  19. data.x = 1;
  20. data.y = 2;
  21. System.out.println("交换之前:x = " + data.x + ",y = " + data.y);//1,2
  22. tools.swap(data);//调用完之后,x与y的值交换?
  23. System.out.println("交换之后:x = " + data.x + ",y = " + data.y);//1,2
  24. }
  25. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读