![Java王者归来:从入门迈向高手](https://wfqqreader-1252317822.image.myqcloud.com/cover/394/27563394/b_27563394.jpg)
8-6 再谈方法
在前面各节的类实例中,所有的方法都是简单没有传递任何参数或是没有任何返回值,这一节将讲解更多方法的应用。
8-6-1 基本参数的传递
在设计类的方法时,也可以增加传递参数给方法。
程序实例ch8_7.java:使用银行存款了解基本参数传递的方法与意义。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P127_563122.jpg?sign=1738880768-cQhBJRFMt3GAxSdTdRE7YhQCzCA6az2d-0-7248d477da3c3731f4f79e55f85e8076)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P127_563145.jpg?sign=1738880768-XvulHv7rIuWj5VzUVHfubKZyN6co2gX2-0-e97c514df024d7a361662cb1a9de0db5)
上述第18行是输出存款前的账户余额,第19行是存款100元,这时A.saveMoney(100)会将100传给类内的saveMoney(int save)方法,程序第5行会执行将此100与原先的余额相加。第20行是输出存款后的账户余额。上述是传递整数参数,其实读者可以将它扩充,传递任何Java合法的数据类型。
8-6-2 认识形参与实参
方法内定义的参数称为形参,以实例ch8_7.java为例,指的是第4行的save。main()内的参数称为实参,以实例ch8_7.java为例,指的是第19行的100。在此笔者统称参数(Parameter)。
8-6-3 参数传递的方法
参数传递有两种,分别是传递值(call by value)和传递地址(call by address)。
1.传递值
main()内调用方法时,main()的实参值会传给方法的形参,在内存内main()的实参与方法的形参各自有不同的内存空间。
程序实例ch8_8.java:传递值的应用。一个数据交换失败的实例,这个程序中第2行使用下列方式声明swap()方法。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P128_759121.jpg?sign=1738880768-YDu0W5Yf42bLtc5pGmTEanUWJX1klhXm-0-454bcb56e20aa3ccfb80c68c0cff8633)
在9-3节中会完整说明在void前面加上public static的目的与意义,在此读者只要了解先加上public static即可。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P128_759123.jpg?sign=1738880768-0vUfPqXYJLcmRzqXZptCKjaVG3cM9rR0-0-be5b090820347655068cc51e7d7c1bc7)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P128_563578.jpg?sign=1738880768-L5oFzpyY5FJUc6UCGirVQiDJ3UM4gJtW-0-3959b0c3a3904b70b55cb88da796d953)
上述程序执行至第13行时,刚进入第2行swap()时,内存图示如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_759126.jpg?sign=1738880768-YGT8xig76UAikwe1mokB2sfyhI2Ap0RV-0-23b1d1281d081df5ac8fd1bcd6062020)
进入到swap()方法的第3行后,内存图式如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_563985.jpg?sign=1738880768-e7V5oKDIIkhHmyWKAJwM3a6TvbWY9r02-0-6d0226f6e20e0ea150baedaf8c324d44)
执行完第5行后,内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_563988.jpg?sign=1738880768-UeAEog1nWYRYbvKu3lFaTphsKTqIyYKl-0-e419b3db234fe55091f1649d83b03cb3)
所以执行第6行时,可以得到x=20,y=10。但是返回main()的第14行输出x和y时,因为main()的x和y内容未改变,所以得到x=10,y=20。
2.传递地址
在Java程序中当所传递的参数是数组或类时,是参照数据类型,所传递的就是地址,下面将以实例配合内存图示说明。
程序实例ch8_9.java:传递地址的应用。一个数据交换成功的实例。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_563992.jpg?sign=1738880768-dl1RILHWRm8FsW63vSdgYaSQYp97qoxO-0-1e0bb3c4df62108ab4f1c8f6fefb10db)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_563998.jpg?sign=1738880768-qF18ony55p0Sd1sVjBE6lbuqLO4LRJ4L-0-0721ef2435d85c158ef9e87680ed64b8)
上述程序执行到第14行时,内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_564001.jpg?sign=1738880768-xqt6YAdHMzv1apsJDoMY6siRosjqlecx-0-deabf15e193322798ee65105318b126e)
当执行第16行进入swap()方法,然后进入第6行执行完毕时,内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P129_564004.jpg?sign=1738880768-qaZ22LlGBxo3fG3CHLdl63p3zXNUhcTR-0-02e688a455f8696fcee2e90d3cbe6976)
第8行执行完毕后,内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P130_564408.jpg?sign=1738880768-wU2ihz1nufYrSbpvnh96NWCZtKXkUDh2-0-7d9949feef0a935830dea4f7fb27e83b)
所以执行第9行和返回main()执行第17行时,可以得到x=20,y=10。
8-6-4 方法的返回值
在Java中也可以让方法返回执行结果,此时语法格式如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P130_759133.jpg?sign=1738880768-TjoUMygxcWXaKQtmbteBxlhi7tGfi2bz-0-a118e18cf04e9fe1082047cb1dbadbc2)
有关返回值可以是表达式的观念,可以参考ch8_11.java的sub()方法。
程序实例ch8_10.java:重新设计程序实例ch8_7.java,这个程序主要是增加saveMoney()方法的返回值,返回值是布尔值true或false。如果执行存款时,存款金额一定是正值,但是程序实例ch8_7.java若是输入负值时,程序仍可运作,此时存款金额会变少,这就是语意上的错误,所以这个程序会对存款金额做检查,如果是正值则执行存款,同时存款完成后列出存款成功,可参考第24行和第25行。如果存款金额是负值,将不执行存款,然后列出存款失败,可参考第27行和第28行。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P130_564416.jpg?sign=1738880768-ZiK89AQlWnTl6Ij1bjSzKwBiwlRRkxWd-0-10002d5c7a3bfcd18f664bb397a7eea7)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P130_564422.jpg?sign=1738880768-z9s6mQaOXGMVgjTaG0Dke38756dyU6t1-0-217a798e8877c1544fc8d952232bb302)
程序实例ch8_11.java:设计一个小型运算的类SmallMath,这个类内有两个整数方法分别是可以执行加法的add()和可以执行减法的sub(),可以分别返回加法和减法的运算结果。在add()方法设计中使用中规中矩的方式,设立变量z,然后返回z。在sub()方法中,则是更有效率的使用方法,直接返回“x-y”的运算结果。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_759136.jpg?sign=1738880768-6ulckCvCizovfK23IdqzPfL9uhD7S27J-0-89171d279ae6e9a0feb72efef84990cb)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_564832.jpg?sign=1738880768-Epz6AQhgpxmdcRjEk480wUq02uOn1Ebj-0-3d480e33c2724272b02197bf837eaf2b)
8-6-5 可变参数的设计
前面所介绍的Java所传递的参数数量是固定的,Java也接受所传递的参数数量是可变的,只需在最后一个参数类型右边加上三个点(…)即可,语法格式如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_759138.jpg?sign=1738880768-w0IcCLOk4RayMFmlUmVcEkoZemjRTRfW-0-1e66cba396775283d8b24d129687632b)
实例1:下面是一个可变参数设计。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_759139.jpg?sign=1738880768-3MgPxttXNx0pzBArD2RyJlOhIcL0U7NT-0-b03b548a6f16d83dc6a04c24d56de34e)
上述“int…y”表示可以接受多个参数,这些参数会被当作数组输入,另外,设计时须留意下列事项。
(1)一个方法只能有一个可变参数,同时必须在最右边。
(2)可变参数本质是一个数组,因此在调用此方法时,可以传递多个参数,也可以传递一个数组。
程序实例ch8_11_1.java:可变参数的应用。这个程序将用三组不同的数据测试可变参数的执行结果。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_564853.jpg?sign=1738880768-iI7TDbPyvIpAkpQPtcLFwHtp2kWVau0q-0-55425b566beeaed6200664e824b64c6b)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P131_564859.jpg?sign=1738880768-Jjw7ttSp0Szko4s5R2BwHYyugBDb3pvJ-0-50197d18fbd560ebba9e55c80fe979d4)