
3.5 字段(field)与方法

扫码看视频
仅声明一个类没有什么意义,在类中通常还需要有字段(也称为数据成员、成员变量或者实例变量)和方法(也称为成员方法、成员函数或者实例方法),才能完成它要承担的任务。字段对应着上面提到的对象的状态,方法对应上面提到的对象的行为。
3.5.1 字段
声明一个类的字段就如同声明一个变量,如代码3.1所示。

x和y都是一个int类型的字段。要想使用这两个字段也很简单。

这段代码运行的结果为:

3.5.2 方法
现在,Point类中有了字段,但是还缺少方法。我们为Point类添加一个show方法,如代码3.2所示。

方法与C/C++语言中的函数类似。一个返回值类型,跟随一个方法名称,后接以圆括号括起来的参数列表,最后是一对花括号扩起来的方法体代码。如果该方法没有返回值,那么使用关键字void声明该方法即可。
调用方法也很简单,创建一个对象,并使用点号“.”运算符来调用指定方法即可。

程序运行的结果为:

3.5.3 方法的参数与返回值
1.参数传递
接下来我们为Point类新增一个init方法,它带有两个参数a和b,分别用来对点的两个坐标值(x和y)进行初始化,如代码3.3所示。

Point类的init方法接受两个int类型的参数,调用该方法会对Point类的数据成员x和y进行初始化。这个程序的运行结果为:

在“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。

在这个例子中,sum方法可以接受不定量的参数。在sum方法中,args变量是一个int类型的数组,该数组的长度与传入参数的个数有关。当我们使用代码“mm.sum(1, 2, 3, 4);”向sum方法传入4个参数之后,args变量就是一个包含4个整型元素的数组,当然也可以直接向sum方法传入一个数组。之后,可以使用for循环来遍历args数组中的各个元素。
需要注意的是,当一个方法需要使用变长参数时,要将变长参数放到整个参数列表的最末尾。

提示:声明变长参数的“…”无论跟在类型后面,还是放在参数名前面都可以,例如,int… list和int …list都是合法的,不过建议读者在编写代码时始终保持统一的编码风格。
3.方法返回值
前面我们编写的都是无返回值的方法,至于是否需要返回值,这要根据方法本身完成的功能来决定。接下来我们改造一下MyMath类,使用带返回值的方法,如代码3.5所示。


在声明一个带返回值的方法时,要指定返回值的类型,在“int subtract (int a, int b)”代码中,subtract前面的int就是方法返回值的类型。当方法需要返回一个值时,可以使用return关键字,并在后面跟随要返回的值。
提示:对于没有返回值的方法,也可以使用一个空的return语句,这时的return语句是用来结束方法运行的。
若声明了一个有返回值的方法,则必须在方法运行结束前返回一个值,否则编译器会报告错误。有时在if/else语句中会出现忘记返回值的情况。

在使用javac编译这个程序时,编译器会提示下面的错误:
