![Java无难事:详解Java编程核心思想与技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/59/35011059/b_35011059.jpg)
3.5 字段(field)与方法
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1738921669-gMtSLEFs3aABBnVArPR4fzoSHpCnh7QI-0-2cfca4db77e2f908b637e760bb4770d9)
扫码看视频
仅声明一个类没有什么意义,在类中通常还需要有字段(也称为数据成员、成员变量或者实例变量)和方法(也称为成员方法、成员函数或者实例方法),才能完成它要承担的任务。字段对应着上面提到的对象的状态,方法对应上面提到的对象的行为。
3.5.1 字段
声明一个类的字段就如同声明一个变量,如代码3.1所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1738921669-233C3L7PFd1kq7mCWzQuo7s2R0ecVG6G-0-fd40aca56cb7057f8c05080a036ac793)
x和y都是一个int类型的字段。要想使用这两个字段也很简单。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1738921669-5uiSELdHNoClanxnpq8QSN52QMcOuCsU-0-46815d1d278cfccd2fae09f907751273)
这段代码运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1738921669-f0rvHAS92IdcsPLUwWULSh9vvjAUSBaJ-0-184eb5ffe14677a5f3936715379c5fd8)
3.5.2 方法
现在,Point类中有了字段,但是还缺少方法。我们为Point类添加一个show方法,如代码3.2所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1738921669-8PavQr7Ix0sw5LFBJ29j03YgnpWNCc16-0-857b53b05cdbb634c1c5550fd6d903c4)
方法与C/C++语言中的函数类似。一个返回值类型,跟随一个方法名称,后接以圆括号括起来的参数列表,最后是一对花括号扩起来的方法体代码。如果该方法没有返回值,那么使用关键字void声明该方法即可。
调用方法也很简单,创建一个对象,并使用点号“.”运算符来调用指定方法即可。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1738921669-o2jT7AtwPwBGarfuRONkFEadd4m3CWuS-0-2accf97b56b91538f6c426d676905ed1)
程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738921669-9eGlRPPT5j0cjdCw1EyIZLx0SfAMXqKN-0-cf7ba31c008fade0506194dc3e0baaf0)
3.5.3 方法的参数与返回值
1.参数传递
接下来我们为Point类新增一个init方法,它带有两个参数a和b,分别用来对点的两个坐标值(x和y)进行初始化,如代码3.3所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1738921669-Vp3JRLr10oCupy7mlfo15jWtMf0jliDh-0-459175378cc69338d7a6fcac761a1eb3)
Point类的init方法接受两个int类型的参数,调用该方法会对Point类的数据成员x和y进行初始化。这个程序的运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738921669-gHwyti3coCgwZHwwbKope09gA0o6vWlR-0-52c452f2478f7e5de7d9345bd989ebc2)
在“void init(int a, int b)”中“int a”和“int b”是init方法的两个参数,它们之间用逗号分隔符分开。a和b是init方法的形参。“pt.init(5, 3);”这行代码调用init方法,并传入两个实参5和3,在参数传入后,a的值为5,b的值为3。之后将a变量的值赋值给x,b变量的值赋值给y。
2.变长参数
使用过C语言的读者对printf函数肯定不陌生,printf函数最大的特点就是它可以接受不定量的参数,也就是变长参数(可变参数)。同样,从Java SE 5.0开始,也新增了方法的变长参数。声明变长参数,只需要在参数类型后面添加“...”即可,表示该方法可以接受多个该类型的参数。我们看代码3.4。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738921669-QxotPBaa991Z853TBZ49s2bTOKsDuk6C-0-7bc6345e77ed00d141b7c757ce727db4)
在这个例子中,sum方法可以接受不定量的参数。在sum方法中,args变量是一个int类型的数组,该数组的长度与传入参数的个数有关。当我们使用代码“mm.sum(1, 2, 3, 4);”向sum方法传入4个参数之后,args变量就是一个包含4个整型元素的数组,当然也可以直接向sum方法传入一个数组。之后,可以使用for循环来遍历args数组中的各个元素。
需要注意的是,当一个方法需要使用变长参数时,要将变长参数放到整个参数列表的最末尾。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1738921669-M9MfPIEJbWeJwrY2nOIxPfm5x7tbPava-0-a50e231f0aba05c74ece3847c9ca396b)
提示:声明变长参数的“…”无论跟在类型后面,还是放在参数名前面都可以,例如,int… list和int …list都是合法的,不过建议读者在编写代码时始终保持统一的编码风格。
3.方法返回值
前面我们编写的都是无返回值的方法,至于是否需要返回值,这要根据方法本身完成的功能来决定。接下来我们改造一下MyMath类,使用带返回值的方法,如代码3.5所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1738921669-veaFOoN3bhe73GFk92BmhWOIeivJRU0P-0-b95a381d93dcd1e1b3bc405c33de6664)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_19.jpg?sign=1738921669-6lZdlpSNmX8nMRLyHj18odlZIBxYy9nV-0-fa6ff6f17c3c900b8ccac50f596627e0)
在声明一个带返回值的方法时,要指定返回值的类型,在“int subtract (int a, int b)”代码中,subtract前面的int就是方法返回值的类型。当方法需要返回一个值时,可以使用return关键字,并在后面跟随要返回的值。
提示:对于没有返回值的方法,也可以使用一个空的return语句,这时的return语句是用来结束方法运行的。
若声明了一个有返回值的方法,则必须在方法运行结束前返回一个值,否则编译器会报告错误。有时在if/else语句中会出现忘记返回值的情况。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_20.jpg?sign=1738921669-Bci0Uk0ou6Gv6Cfs1k71RWuVdjTuJ7JR-0-b63c27088151580016793d163e6bef15)
在使用javac编译这个程序时,编译器会提示下面的错误:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_21.jpg?sign=1738921669-rCQSk99HVCBwgNFYNgKGxQUc8lwuUYIc-0-88bad198a83b9b55e91fa1a3517cddd0)