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 }
网站标题:方法和传递
标题链接:
http://jkwzsj.com/article/dsopccs.html