1 package com.Lucky.base; 2 3 public class method { 4 //方法 java是值传递 5 6 //main主方法 7 8 //值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 9 // 与 10 // 引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数 11 //按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值) 12 public static void main(String[] args) { 13 14 int m= max(12,12); 15 System.out.println(m); 16 17 18 //调用printMax方法: 19 double dou=printMax(1,5,6,7,8); 20 System.out.println(dou); 21 22 23 24 ///传递【1.可以发现,数据并没有发生改变】 25 System.out.println("----传递【1.可以发现,数据并没有发生改变】----"); 26 String tes="正常数据"; 27 System.out.println(tes); 28 test(tes); //试着改变tes的内容 29 System.out.println(tes); 30 /* 31 解析: 是tes变量的拷贝,不是真正的tes,test()方法中改变的是拷贝,对真正的tes是没有影响的 32 */ 33 34 //【2.发生纠结:引用类型的时引用传递??????】 35 System.out.println("----传递【【2.发生纠结】】----"); 36 Users users=new Users(); 37 users.setName("测试代码"); 38 users.setAge(999); 39 Users us=test1(users); //试着改变users的内容【结果发生改变】 40 System.out.println(us.getAge()); 41 System.out.println(us.getName()); 42 /* 43 解析: 指向的地址是同一个,因此对变量中的数据修改时,还是会影响到原来真实的变量 44 */ 45 46 47 //3.决定一探究竟 48 System.out.println("----决定一探究竟String引用类型----"); 49 String strOld="我要试试String这个引用类型怎么样"; 50 System.out.println(strOld); 51 strOld="什么鬼,发生改变了"; 52 System.out.println(strOld); 53 /* 54 解析:String变量比较特殊,我们看String的源码可以知道, 55 String的值是通过内部的char[]数组来维护的, 56 但是这个数据定义的是final类型的, 57 因此,String的值是不可变的。我们平时修改String的值, 58 其实是重新new了一个String对象,这个对象的值是: 什么鬼,发生改变了, 59 并把这个对象的引用地址赋给了a,原来的hello还是在堆中,只是这个值没有被引用, 60 过段时间会被gc垃圾回收。 61 */ 62 63 //4.峰回路转【感觉好像又行了】 64 System.out.println("---峰回路转【感觉好像又行了】----"); 65 users.setName("测试不同堆地址的对象代码"); 66 users.setAge(666); 67 Users se=test2(users); 68 System.out.println(us.getAge()); 69 System.out.println(us.getName()); 70 /* 71 解析: 修改的是变量在栈中的地址,则不会影响原变量 72 */ 73 74 75 } 76 77 //比大小 78 public static int max(int a,int b){ 79 int result=0; 80 81 if(a>b){ 82 result=a; 83 }else if(a<b){ 84 result=b; 85 }else{ 86 System.out.println("两个值相等"); 87 result=0; //两个数值相同 返回0 88 } 89 90 91 return result; 92 } 93 94 //方法重载: 方法名相同,参数数量、参数顺序、参数类型不同 95 public static int max(int a,int b,int c){ 96 int result=0; 97 98 if(a>b){ 99 result=a; 100 }else if(a<b){ 101 result=b; 102 }else{ 103 System.out.println("两个值相等"); 104 result=0; //两个数值相同 返回0 105 } 106 return result; 107 } 108 109 110 /* 111 可变参数:用...来表示 例如:int... A; 112 注意点:1.每个方法中只能存在一个可变参数,而且位置必须在最后一位 113 */ 114 //遍历排序案例:最大值 115 public static double printMax(double... A){ 116 double result=A[0]; //将第一个数据拿出来 117 if(A.length==0){ 118 System.out.println("没有数据"); 119 }else { 120 //遍历数据,逐个比对 121 for (int i = 1; i < A.length; i++) { 122 if(A[i]>result){ 123 result=A[i]; 124 } 125 } 126 } 127 return result; 128 } 129 130 131 132 133 134 135 ////////////////////////值传递与引用传递的案例////////////////////////// 136 137 138 public static String test(String str){ 139 str="测试值传递:java"; 140 return str; 141 } 142 143 144 public static Users test1(Users users){ 145 //不创建新的对象,现在改变内容,指向同一个堆的地址,使其发生改变 146 users.setAge(20); 147 users.setName("唯易"); 148 return users; 149 } 150 151 152 public static Users test2(Users users){ 153 users=new Users(); //创建新对象,改变存储在栈中的地址;令该对象指向不同的堆的内存中 154 users.setName("唯易"); 155 users.setAge(20); 156 return users; 157 } 158 159 160 } 161 162 //外部类【为了演示使用】 163 class Users{ 164 private String name; 165 private Integer age; 166 167 public String getName() { 168 return name; 169 } 170 171 public void setName(String name) { 172 this.name = name; 173 } 174 175 public Integer getAge() { 176 return age; 177 } 178 179 public void setAge(Integer age) { 180 this.age = age; 181 } 182 183 }