![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=1734463636-8OMMHXAufLlHwy92k2bWOYs389w59v0h-0-bcce07cf9c1ef95d4f54442fc2c6813c)
扫码看视频
仅声明一个类没有什么意义,在类中通常还需要有字段(也称为数据成员、成员变量或者实例变量)和方法(也称为成员方法、成员函数或者实例方法),才能完成它要承担的任务。字段对应着上面提到的对象的状态,方法对应上面提到的对象的行为。
3.5.1 字段
声明一个类的字段就如同声明一个变量,如代码3.1所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1734463636-xPIcAPrveLG2M1J8JxRL9hWDc9TihMia-0-7eff8f169c93c96194bf1d7c3ebdfcb6)
x和y都是一个int类型的字段。要想使用这两个字段也很简单。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1734463636-ZU4a4RlAi2EuILzTVz72m2Jlhmivmgow-0-b9f14a980063ff3bce9b24d5a6234922)
这段代码运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1734463636-42Z7yaJy1jLsC6bpcSgXtFcJDKdaUhIP-0-51851771bcc1a631137e064c6832ef0e)
3.5.2 方法
现在,Point类中有了字段,但是还缺少方法。我们为Point类添加一个show方法,如代码3.2所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1734463636-BPyKgOLd8EyaVww9iANlfing5PwOYD3x-0-08f478e99923d17c8edea19d8a7b0422)
方法与C/C++语言中的函数类似。一个返回值类型,跟随一个方法名称,后接以圆括号括起来的参数列表,最后是一对花括号扩起来的方法体代码。如果该方法没有返回值,那么使用关键字void声明该方法即可。
调用方法也很简单,创建一个对象,并使用点号“.”运算符来调用指定方法即可。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1734463636-44UdcWaiNa1MM2UhHoc7shB38THi9itx-0-11f4b3f0c92f6dd204175475e1b4561d)
程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1734463636-6crEmIDDsGudY319X3vrWeYUQhIze1Fb-0-0fe3013e8503ad2cd4437e983dba652f)
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=1734463636-qKcQOPqALT0eLtB1AilD6Iz4EhZQxxw5-0-d90eeb8b789bec2cc3924e2ab1179fcd)
Point类的init方法接受两个int类型的参数,调用该方法会对Point类的数据成员x和y进行初始化。这个程序的运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1734463636-MKw8b8A4o4XNI9llBgivcLckidwVmEXT-0-0877c0d7fceb7a7dd495e41d50c36e3b)
在“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=1734463636-Yz2H89HZtEMGEAWQFZ5P92Ets5NxgKm5-0-8c6538891fdab51dcd94b8d48919595e)
在这个例子中,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=1734463636-yAOJ21fTujWS6kiBDIprQKapuZG8Oncc-0-cbb6f7409ace3f4d797e7e8ced9c45c3)
提示:声明变长参数的“…”无论跟在类型后面,还是放在参数名前面都可以,例如,int… list和int …list都是合法的,不过建议读者在编写代码时始终保持统一的编码风格。
3.方法返回值
前面我们编写的都是无返回值的方法,至于是否需要返回值,这要根据方法本身完成的功能来决定。接下来我们改造一下MyMath类,使用带返回值的方法,如代码3.5所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1734463636-s20u2nlcydSKSBPtLhKtfNZ6e4aOdYW1-0-f7dcd792e684047e9b44b6b457ec1a30)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_19.jpg?sign=1734463636-ZnVBznHE3jjB9q3u5pJv4cVVigQkRLZf-0-75d0f948b6c648e1d65eba74859a6a15)
在声明一个带返回值的方法时,要指定返回值的类型,在“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=1734463636-D1EV44no3nqJPIxhRHDnA2OKnp7v8i4W-0-98f056b269b48392bd061a0bf135791c)
在使用javac编译这个程序时,编译器会提示下面的错误:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_21.jpg?sign=1734463636-neuNrFnt3NyRaxwv7aKawQpwDiqnSncF-0-c9afaca055c044f62ea5ff6db9e587b4)