ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java面向对象(二) [打印本页]

作者: 张春    时间: 2022-8-24 22:00
标题: Java面向对象(二)
Java面向对象(二)


目录

五、方法

5.1 方法的重载(overload)

情况一:
  1. public class OverloadTest {
  2.     public static void main(String[] args){
  3.         OverloadTest o = new OverloadTest();
  4.         
  5.         System.out.println(o.getSum(1,2));                // 输出3
  6.         System.out.println(o.getSum(1.0,2.0));        // 输出3.0
  7.         System.out.println(o.getSum(1.0,2));        // 输出3.0
  8.     }
  9.     public int getSum(int a,int b){
  10.         return a + b;
  11.     }
  12.     public double getSum(double a,double b){
  13.         return a + b;
  14.     }
  15. }
  16. /*         可以看到,我们并没有定义 getSum(double,int)类型的方法,但是 getSum(1.0,2)还是正常输出,没有报错。
  17.         这里getSum(1.0,2)是调用了getSum(double a,double b)的方法,原因是实参2被自动转换为double类型并传递给这个方法。
  18.        
  19.         那为什么getSum(1,2)调用时不会使用getSum(double a,double b)方法?
  20.         原因:
  21.         其实 getSum(int a,int b) 和 getSum(double a,double b) 都是 getSum(1.0,2) 可能的匹配。调用方法时,Java编译器会查找最精确匹配的方法,因为方法 getSum(int a,int b) 比 getSum(double a,double b) 更精确,所以调用 getSum(1,2) 时使用的是getSum(int a,int b)。
  22.        
  23. */
复制代码
情况二:
  1. public class OverloadTest {
  2.     public static void main(String[] args){
  3.         OverloadTest o = new OverloadTest();
  4.         System.out.println(o.getSum(1,2));
  5.     }
  6.     public double getSum(int a,double b){
  7.         return 1.0;
  8.     }
  9.     public double getSum(double a,double b){
  10.         return 2.0;
  11.     }
  12. }
  13. /*         输出 1.0
  14.         根据调用方法时,Java编译器会查找最精确匹配的方法。
  15.         所以 getSum(1,2)调用时使用的是 public double getSum(int a,double b)方法
  16. */
复制代码
情况三:
有时调用一个方法时会有两个或多个可能的匹配,但编译器无法判断哪个是最精确的匹配。这就称为“歧义调用”(ambiguous invocation),会产生编译错误。
  1. public class OverloadTest {
  2.     public static void main(String[] args){
  3.         OverloadTest o = new OverloadTest();
  4.         System.out.println(o.getSum(1,2));
  5.     }
  6.     public double getSum(int a,double b){
  7.         return 1.0;
  8.     }
  9.     public double getSum(double a,int b){
  10.         return 2.0;
  11.     }
  12. }
  13. /*        编译报错:
  14.         Error:(9, 29) java: 对getSum的引用不明确
  15.         javase.OverloadTest 中的方法 getSum(int,double) 和 javase.OverloadTest 中的方法 getSum(double,int) 都匹配       
  16. */
复制代码
5.2 可变参数的形参

  1. //JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
  2. public class Test {
  3.     public static void main(String[] args){
  4.         Test o = new Test();
  5.         o.test(new String[]{"aa","bb","cc"});        //调用时必须new String[]数组
  6.     }
  7.     public static void test(String[] books){
  8.     for (int i = 0; i < books.length; i++) {
  9.             System.out.println(books[i]);
  10.         }
  11.     }
  12. }
  13. //JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
  14. public class Test {
  15.     public static void main(String[] args){
  16.         Test o = new Test();
  17.         o.test(new String[]{"aa","bb","cc"});        //同样可以用
  18.         o.test("aa","bb","cc");                                        //更加简单
  19.     }
  20.     public static void test(String ... books){
  21.         for (int i = 0; i < books.length; i++) {
  22.             System.out.println(books[i]);
  23.         }
  24.     }
  25. }
  26. /*        输出:
  27.         aa
  28.         bb
  29.         cc
  30. */
复制代码
5.3 方法参数的值传递机制

  1. //        针对基本数据类型:
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         int num1 = 1;
  5.         int num2 = 2;
  6.         System.out.println("在调用 swap 方法前,变量 num1 的值为:" + num1 + ",变量 num2 的值为:" + num2);
  7.         swap(num1, num2);
  8.         System.out.println("在调用 swap 方法后,变量 num1 的值为:" + num1 + ",变量 num2 的值为:" + num2);
  9.     }
  10.     public static void swap(int n1, int n2) {
  11.         System.out.println("在进行交换前,变量 n1 的值为:" + n1 + ",变量 n2 的值为:" + n2);
  12.         int temp = n1;
  13.         n1 = n2;
  14.         n2 = temp;
  15.         System.out.println("在进行交换后,变量 n1 的值为:" + n1 + ",变量 n2 的值为:" + n2);
  16.     }
  17.    
  18. }
  19. /*        输出结果:
  20.         在调用 swap 方法前,变量 num1 的值为:1,变量 num2 的值为:2
  21.         在进行交换前,变量 n1 的值为:1,变量 n2 的值为:2
  22.         在进行交换后,变量 n1 的值为:2,变量 n2 的值为:1
  23.         在调用 swap 方法后,变量 num1 的值为:1,变量 num2 的值为:2
  24.         可以看到,num1 和 num2 的值并没有因为调用 swap 方法而进行交换。
  25. */
复制代码
Java 内存分析:
  1. //        针对引用数据类型:
  2. public class Test {
  3.     public static void main(String[] args) {
  4.         Data data = new Data();
  5.         data.m = 10;
  6.         data.n = 20;
  7.         System.out.println("m = " + data.m + ", n = " + data.n);
  8.         Test test = new Test();
  9.         test.swap(data);
  10.         System.out.println("m = " + data.m + ", n = " + data.n);
  11.     }
  12.     public void swap(Data d){
  13.         int temp = d.m;
  14.         d.m = d.n;
  15.         d.n = temp;
  16.     }
  17. }
  18. class Data{
  19.     int m;
  20.     int n;
  21. }
复制代码
Java内存分析:

所以,在写交换数组元素位置方法时:
  1. //错误的:交换数组中指定两个位置元素的值
  2. //        public void swap(int i,int j){
  3. //                int temp = i;
  4. //                i = j;
  5. //                j = temp;
  6. //        }
  7.         //正确的:交换数组中指定两个位置元素的值
  8.         public void swap(int[] arr,int i,int j){
  9.                 int temp = arr[i];
  10.                 arr[i] = arr[j];
  11.                 arr[j] = temp;
  12.         }
复制代码
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                
  4.                 String s1 = "hello";
  5.                
  6.                 Test test = new Test();
  7.                 test.change(s1);
  8.                
  9.                 System.out.println(s1);       
  10.                
  11.         }
  12.        
  13.         public void change(String s){
  14.                 s = "hi";
  15.         }
  16. }
  17. //        输出:hello
复制代码
Java内存分析:

结论:String 属于引用类型变量,形参仍然接收的是实参变量的地址值,只是字符串在常量池是一个 char[] 型的一个字符数组,新赋值 hi 时会在常量池新创建一个字符数组,再将 hi 字符串的地址赋值给 s 变量。
5.4 递归方法


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4