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 }

发表回复