上一篇文章:Java程序的构成
本篇内容
方法
在前面的文章中,已经提到过方法的定义,但是不够详细,所以这里再详细介绍一下
定义方法的完整格式为如下:
方法头:是指方法的修饰符(modifier)、返回值类型(return value type)、方法名(method name) 和方法的参数(parameter)
带返回值的方法:value-returning method
无返回值的方法:void method。无返回值的方法仅仅是一个过程(procedure),实现一个具体的功能
形式参数&形参(formal parameter):定义在方法头中的变量,简称形参(parameter)
实际参数&实参(actual parameter & argument):调用方法时给形参传递的一个值
参数列表(parameter list):指明方法中参数的类型、个数和顺序
参数
参数传值
一般参数传值: 一般情况下普通的参数传值,直接将实参的数值复制到形参
引用类型参数传值: “引用”相当于C语言当中的指针,将引用传给形参,在方法中改变引用当中的实体。Java中的数组就是引用类型,包括创建的对象也是引用类型的
class Circle { //Circle类
double radius; //定义一个半径
Circle(double r){ //构造方法,创建对象时给radius赋初值
radius = r;
}
}
class Area { //Area类
double circleArea(Circle cir){ //定义了一个返回值为double型的方法,其中的参数为Circle类,即引用型参数传值
cir.radius = 3.0; //修改圆的半径的值,由原来的5.0变为3.0
return 3.1415926*cir.radius*cir.radius;
}
}
public class Example {
public static void main(String args[]){
Circle cir = new Circle(5.0); //创建一个Circle类的对象,并给radius赋值为5.0
Area area = new Area(); //创建一个Area类
System.out.println("圆的半径修改前:"+cir.radius);
double area_cir = area.circleArea(cir); //cir为Circle类,引用型参数传值,调用方法
System.out.println("圆的面积为:"+area_cir);
System.out.println("圆的半径修改后:"+cir.radius);
}
}
可变参数
可变参数(the variable arguments): 可变参数是指同一数据类型的形参的个数不确定,用三个点...
来代替。
如public void method_1(int ... a)
,在这个method_1方法头中,从第一个参数直到最后一个参数的个数不确定,统一用变量a
来代替,这个变量a
就像是这些参数的“代表”。
再如public void method_2(double a, int ... b)
,在这个method_2方法头中,第一个参数是一个double型的,从第二个形参开始直到最后一个参数都是int类型的
“参数代表”必须是参数列表的最后一个,public void method_3(int ... x, int y)
是错误的,因为参数代表后面还有一个int型的变量y
class ComputeSum {
int c_sum(int ... x){
int a = x.length; //x.length统计传进的参数的个数
int sum = 0;
for(int i = 0; i < a; i++){ //可采用下标的方式使用参数代表
sum += x[i];
}
return sum;
}
}
public class Example {
public static void main(String args[]){
ComputeSum a = new ComputeSum();
System.out.println(a.c_sum(1, 2, 3));
System.out.println(a.c_sum(5, 3, 9, 2, 32, 6));
}
}
对象的组合
在一个类体中创建了另外一个类的对象,这就是对象的组合。
在同一个文件夹中保存三个Java源文件,分别如下:
//文件名:Circle.java
public class Circle { //类名Circle,源文件的名字应当和类名保持一致
double radius, area; //成员变量radius和area
void setRadius(double r){ //void型的方法,参数double型的r
radius = r;
}
double getRadius(){ //double型的方法,返回值为double型
return radius;
}
double getArea(){
area = 3.14*radius*radius; //计算圆面积并返回值
return area;
}
}
//文件名:Circular.java
public class Circular {
Circle bottom; //创建一个Circle类的对象
double height;
void setBottom(Circle c){
bottom = c;
}
void setHeight(double h){
height = h;
}
double getVolume(){
if(bottom == null)
return -1;
else
return bottom.getArea()*height/3.0;
}
double getBottomRadius(){
return bottom.getRadius();
}
public void setBottomRadius(double r){
bottom.setRadius(r);
}
}
//文件名:Example.java
public class Example {
public static void main(String args[]){
Circle circle = new Circle(); //创建一个Circle对象circle
circle.setRadius(10.0);
Circular circular = new Circular(); //创建一个Circular类的对象,形成对象的组合
System.out.println("circle的引用:"+circle); //直接输出对象的引用
System.out.println("圆锥的bottom的引用:"+circular.bottom); //此时的bottom还是一个空对象null
circular.setHeight(5);
circular.setBottom(circle); //此时bottom不再是null空对象,而是circle
System.out.println("circle的引用:"+circle); //再次输出circle的引用
System.out.println("圆锥的bottom的引用:"+circular.bottom); //现在bottom的引用和circle的引用是一致的
System.out.println("圆锥的体积:"+circular.getVolume());
System.out.println("修改circle的半径,bottom的半径同样变化");
circle.setRadius(50);
System.out.println("bottom的半径:"+circular.getBottomRadius());
System.out.println("重新创建circle,circle的引用将发生变化");
circle = new Circle();
System.out.println("circle的引用:"+circle);
System.out.println("但是不影响circular的bottom的引用");
System.out.println("圆锥的bottom的引用:"+circular.bottom);
}
}
运行结果: