通过我们前边关于传递数组给方法,传递的是数组的引用。同样,我们平时说的对象变量也是引用,所以它与传递数组引用是一样的,方法中改变对象的值在退出方法后依旧有效。
class CircleCount
{
private double r=1.0;
private static int count=0;
CircleCount()
{
CircleCount.count++;
}
CircleCount(double r)
{
this.r=r;
CircleCount.count++;
}
public double getR()
{
return this.r;
}
public void setR(double r)
{
this.r=(r>0?r:0);
}
public static int getCount()
{
return count;
}
public double getArea()
{
return r*r*Math.PI;
}
}
public class TestCount
{
public static void main(String [] args)
{
CircleCount C1=new CircleCount();
printAreas(C1,5);
System.out.println("finally,r="+C1.getR()+",count="+C1.getCount());
}
public static void printAreas(CircleCount C,int times)
{
while(times>0)
{
System.out.println("r="+C.getR()+",area="+C.getArea());
C.setR(C.getR()+1);
times--;
}
}
}
所以,可以看到,在方法中对r进行了修改,出来方法后,该修改依旧是有效的。
2 定义对象数组 array of objects
前边我们在声明一个int型数组时候是这样的, int [ ] a=new int[10],然后可以使用循环对其进行初始化。所以类似的,声明一个对象型数组也是这样 例如我们上面的CirceCount, CircleCount [ ] arrayObject=new CircleCount[10];但是,但是,这里要注意,因为int型是基本数据类型,我们int [ ] a=new int[10] 这样就在堆上分类了十个 int型的空间。但是对象变量是引用,所以我们new CircleCount[10]只是在堆上分配了10个对象引用,真正的各个独自的对象还没有在内存中分配空间,所以这里如果我们直接使用arrayObject[i].setR()等等,运行时候是会出现 nullPointer的exception的。如图
同样利用一个循环对创建出来的对象数组进行初始化是创建具体的对象;
for(int i=0;i<array.length;i++)
{
arrayObject[i]=new CircleCount(i);
}
这样相当如下图了,注意图中因为count 及getCout是静态方法跟变量,所以不会出现在各个对象各自的空间中,他们会放在一个common的地方,每个对象公用的,这里没有画出来
这样之后我们才可以使用各个对象各自的方法了。
下面看看将数组对象作为参数传入方法
class CircleCount
{
private double r=1.0;
private static int count=0;
CircleCount()
{
CircleCount.count++;
}
CircleCount(double r)
{
this.r=r;
CircleCount.count++;
}
public double getR()
{
return this.r;
}
public void setR(double r)
{
this.r=(r>0?r:0);
}
public static int getCount()
{
return count;
}
public double getArea()
{
return r*r*Math.PI;
}
}
public class TestCount
{
public static void main(String [] args)
{
CircleCount [] C1=new CircleCount[10];
for(int i=0;i<C1.length;i++)
{
C1[i]=new CircleCount(i);
}
printObjects(C1);
}
public static void printObjects(CircleCount [] C)
{
int total=0;
for(int i=0;i<C.length;i++)
{
System.out.println("r"+i+"="+C[i].getR()+",Area"+i+"="+C[i].getArea());
total+=C[i].getArea();
}
System.out.println("total area="+total);
}
}