- Java无难事:详解Java编程核心思想与技术
- 孙鑫
- 1316字
- 2021-01-05 17:31:25
3.5 字段(field)与方法
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1734539910-NwNGKlYRKaQS80LHyb87b6B1chyIa5UT-0-34232de4180cce528d9c67f6aa7194c3)
扫码看视频
仅声明一个类没有什么意义,在类中通常还需要有字段(也称为数据成员、成员变量或者实例变量)和方法(也称为成员方法、成员函数或者实例方法),才能完成它要承担的任务。字段对应着上面提到的对象的状态,方法对应上面提到的对象的行为。
3.5.1 字段
声明一个类的字段就如同声明一个变量,如代码3.1所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1734539910-2gR30Dto8MjTu2fwIIe12jIWl79AvTdk-0-0bb33724b6eb37c5b224fa5ceb974d32)
x和y都是一个int类型的字段。要想使用这两个字段也很简单。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1734539910-ee4KoV0TYTLw8T82DBLqr3voPl89U3VD-0-cb9b843e781370f8779232fb52b82238)
这段代码运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1734539910-l8orzeL4LsOkbIku3nKSknWxMhlEdXtS-0-aa92ced8c2c0c5946755e0cdbeb0b498)
3.5.2 方法
现在,Point类中有了字段,但是还缺少方法。我们为Point类添加一个show方法,如代码3.2所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1734539910-FtyGZeQ7QDG7trYwYElLTtHDGKnWRPAv-0-85ab95218c784f40327699f7cd225fdc)
方法与C/C++语言中的函数类似。一个返回值类型,跟随一个方法名称,后接以圆括号括起来的参数列表,最后是一对花括号扩起来的方法体代码。如果该方法没有返回值,那么使用关键字void声明该方法即可。
调用方法也很简单,创建一个对象,并使用点号“.”运算符来调用指定方法即可。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1734539910-gbOZEAMah88W56YeOTpA5Ly1S7mfl7hh-0-a9b7403c113f1d7d8f11dc6986989dca)
程序运行的结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1734539910-NMuhV0RZzrh0OtWhFmea5wbwRXYxXorK-0-47baf99c418d681e7062f2bebe96a1f6)
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=1734539910-On5ByU9bBzajqPjjIWWacpvtJG2OGSYH-0-7b59005b9b8bcb36499b1dfe76b03208)
Point类的init方法接受两个int类型的参数,调用该方法会对Point类的数据成员x和y进行初始化。这个程序的运行结果为:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1734539910-t6FivdfMbur6M545BWmsu89JMNj8Z5Rc-0-b44935fd364e405d1d236836a895a4a2)
在“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=1734539910-9Rl7b6eTj0Xg9lkOkqqOQd3i3rlkCqYX-0-11094bae0b408cb2e11bd734f166de6e)
在这个例子中,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=1734539910-xobWdpWUzehmOEksg24ElazCcxv3143A-0-bc4fbd2cb206f9f8e86f08a4c0db68d6)
提示:声明变长参数的“…”无论跟在类型后面,还是放在参数名前面都可以,例如,int… list和int …list都是合法的,不过建议读者在编写代码时始终保持统一的编码风格。
3.方法返回值
前面我们编写的都是无返回值的方法,至于是否需要返回值,这要根据方法本身完成的功能来决定。接下来我们改造一下MyMath类,使用带返回值的方法,如代码3.5所示。
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1734539910-kYy8Nl0JbOFSxQVSlbl3jxo9wwZT1ujK-0-4f38665a93e1b90561c9456e659d5301)
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_19.jpg?sign=1734539910-TBwnBgzfiIIWWCyRyobcDjPbWXzxfnuF-0-1f25a22627062ba5a294627969158776)
在声明一个带返回值的方法时,要指定返回值的类型,在“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=1734539910-779MnGH7cH0wxtL9HKdAYirCDxYNB0Iz-0-956622eaa6998afcd7bc4a03e92b8ac8)
在使用javac编译这个程序时,编译器会提示下面的错误:
![img](https://epubservercos.yuewen.com/AD1899/18685354708165706/epubprivate/OEBPS/Images/txt003_21.jpg?sign=1734539910-LqHbqlZdE0Y5Xh3JkuoGUqxMdZo9OS1R-0-eb0ef76bd1f4ebf030aefc647438411a)