黑马程序员____类

时间:2023-02-18 20:29:55

----------------------android培训java培训、期待与您交流! ----------------------

 

        一个类是一个抽象数据的实现。对象是通过对类进行实例化所产生的,在类定义中指明了该类的对象多能保持的数据种类和对象所能完成的操作,这些描述统称为类的成员。 如图1.3所示,一个类有4种成员,分别称为fieldmethodinner classinterface

         filed指存储数据的变量,method则是完成操作的函数,在类中,可以定义只用于该类的所谓inner classinterface。图1中还列出了四种常用的特定方法constructoraccessormutatorutility

 黑马程序员____类

              图1  类的成员

        一个constructor是用于建立该类对象的方法,这一过程也称为实例化,所产生的对象称为该类的实例,该方法的另一个作用就是对所创建的对象中地各个field进行初始化。

         一个accessor方法是一个只读函数,它返回类中某个field的值,这样就避免外部方法对field的直接修改。在Java语言中,访问某个field X的存取方法常取名为getX(),正因为如此,Java中的存取方法也常称为“getty”方法。

         一个mutator方法是一个读写函数,允许外部方法调用该方法来改变类中某个field的值。在Java中,改变某个field  Xmutator方法常取名为set X(),正因为如此,Java中的存取方法也常称为“setty”方法。

         一个utility方法是一个私有函数,在该类中的其他方法内部使用。

1 Point

         下面的程序中定义了一个Point类,它的实例可表达欧几里德平面中的点。

public class Point
{
	protected double x,y;
	public Point(double x,double y)
	{
		this.x = x;
		this.y = y;

	}
	public double getX()
	{
		return x;
	}
	public double getY()
	{
		return y;
	}
	public Point getLocation()
	{
		return new Point(x,y);
	}
	public void setLocation(double x,double y)
	{
		this.x = x;
		this.y = y;
	}
	public void translate(double dx,double dy)
	{
		x += dx;
		y += dy;
	}
	public boolean equals(Object object)
	{
		if(object == this) return true;
		if(object.getClass()!=this.getClass()) return false;
		Point point = (Point)object;
		return (x == point.x && y == point.y);
	}
	public int hashCode()
	{
		return(new Double(x)).hashCode()+(new Double(y)).hashCode();
	}
	public String toString()
	{
		return new String("("+(float)x+","+(float)y+")");
	}
}


 

从上可以看出,该类有xy两个field成员、一个构造函数和getX()getY()getLocation()hashCode()toString()5个存取方法以及一个mutaro方法translate(double,double)

         下面是对类Point进行操作测试的驱动程序:

public class Ex0107
{
	public static void main(String [] args)
	{
		Point p = new Point(2,3);
		System.out.println("p = "+p);
		System.out.println("p.hashCode() = "+p.hashCode());
		Point q = p.getLocation();
		compare(p,q);
		q.translate(5,-1);
		compare(p,q);
		q = p;
		compare(p,q);
	}
	private static void compare(Point p,Point q)
	{
		System.out.println("q = "+q);
		System.out.println("q.hashCode() = "+q.hashCode());
		if(q.equals(p)) System.out.println("q equals p");
		else System.out.println("q does not equals p");
		if(q==p) System.out.println("q == p");
		else System.out.println("q != p");
	}
	
}

该测试程序的执行结果为:

黑马程序员____类

        在该测试驱动程序中,包括了一个utility方法compare(Point,Point)来辅助测试操作。

       从输出可以看出,phashCode()值为-2146959360。该数值没有特别的含义,仅仅用做一个标识,它从对象的xY成员通过计算的到的,q开始时作为p的一个拷贝,因为具有同样的hashCode()值,此时equalsObject)方法返回值为true。但是,测试q==p的返回值却为false,这是因为Pq的确是不同的对象。相等运算符==实际是检查是否具有相同的标识,而不是判断对象是否具有相同的值,只有在指向同一个对象的两个不同引用变量间进行比较时才返回true

         q转换成location(7,2)后,方法equals(Object)返回值为false.

        最后,当引用p被赋值为q时,q==p返回值为true,这是因为此时仅有一个Point对象存在,也就是最初的Point(2,3)对象,另一个Point(7,2)对象将被收回,也就是说,当引用变量q失去了指向对象Point(7,2)的引用后,该对象就不存在了,参见图2

        黑马程序员____类                          

                                  图2 测试程序中各对象及其变化                 

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima