下面是编写完美的equals方法的建议:
1、现实参数命名为otherObject -- 稍后,我们需要把它类型转换为零一个叫做other的变量
2、测试this同otherObject是否是同一个对象:
if (this == otherObject) return true;
这其实只是一个优化。实践中,是同一个对象的情况很常见。检查是否相等比进行字段比较花费的开销要小得多。
3、测试otherObject是否为null,如果是,就返回false。这项测试是必需的。
if (otherObject == null) reutrn false;
4、测试this和otherObject是否属于同一个类。这项测试是“对称性规则”所要求的。
if (getClass() != otherObject.getClass()) return false;
5、把otherObject的类型转换为你的类所属的类型:
ClassName other = (ClassName)otherObject
6、最后,比较所有的字段。使用 == 比较基本类型字段,使用equals比较对象字段。如果所有字段都匹配,则返回true;否则,返回false。
return field1 == other.field1 && field2.equals (other.field2)
如果遵循以上的规则定义了一个类的equals方法,定义其子类的equals方法时,首先调用超类的equals方法。如果这项测试不能通过,对象也就不可能相等。如果超类字段相等,那么需要比较子类的实例字段。
class Manager extends Employee
{
...
public boolean equals (Object otherObject)
{
if (!super.equals (otherObject)) return false;
Manager other = (Manager)otherObject;
//
return bonus == other.bonus;
}
}
下面归纳了Java程序设计语言中利用方法参数可以做到和不能做到的几种情况:
·方法不能修改基本类型(即数字或布尔值)的参数。
·方法可以修改对象参数的状态。
·方法不能让对象参数指向新的对象。
·Java的方法参数是按值传递
这两天效率很低,很简单的东西,主要是有点懒,现在都很顺利,工具栏也有了,效果也出来了。
多加了几种图形,很多图形的操作方式都很相似,比如说直线和矩形都是记录一个起始点一个结束点,这个时候就能体现出类继承里虚函数动态绑定的好处了,今天的理解上了一个层次,这些东西的确是要多做才能真正理解的。
今天有收获。
共有三种方式:
1、声明一个全局的hInst变量,在WinMain里面hInst = hInstance
2、((LPCREATESTRUCT)lParam)->hInstance,通过CREATESTRUCT结构获得
3、hInst = GetWindowLong (hwnd, GWL_HINSTANCE);
ps: CREATESTRUCT结构包含了窗体创建初始化时的各种信息:
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCTSTR lpszName;
LPCTSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;
今天的成果比较丰富, 实现了满多的功能, 当然少不了书的帮助, 下面要开始做对话框了.
InvalidateRect是将客户区标记为无效,并产生WM_PAINT消息,Windows会将WM_PAINT消息放入队列,等待窗口过程的处理,然后操作系统将WM_PAINT当作是低优先级消息,如果后面有其他的动作要处理,则可能会出现空白的区域需要等待一段时间才被刷新。
UpdateWindow则将导致操作系统立即用WM_PAINT调用窗口过程,而不进入队列,使窗口得到立即的刷新。窗口过程完成刷新后立即退出,Windows将控制返回给UpdateWindow之后的语句。
把写好的类添加到了DrawPad里面, 还是在被滚动条郁闷. 昨天在实验一下在一张已有位图上画线, 也画不出来, 今天花了15分钟从头写了一个小程序测试一下, 终于发现了, 用于接受位图对象的内存设备描述表hdcMem, 每次使用之后必须要释放, 否则就画不上去, 也就是说下面的两句语句应该也要成对出现:
hdcMem = CreateCompatible (hdc);
DeleteDC(hdcMem);
今天成果不大,主要还是在完善位图类,并且做滚动条。为滚动条我又写了两个成员函数,用来移动SetDIBitsToDevice里面的坐标标记的,一开始都很顺利,我还很高兴呢,能这么简单的完成一项,可是到后面不对了。每点一下滚动条的箭头,我移动一行像素,可是后来发现一次移动超过一行像素就不对了,在滚动出来的图像上的部分图像缩小了,x和y方向上都缩小了,我仅仅写了x方向上的滚动,真是百思不得其解,一点头绪也没有。放到明天解决吧,不管怎样,明天我要在主要的工程上工作了,这个类已经完善enough了,可以移过去了。
很简单的问题,帮陈凯查程序的时候发现了,就记一下:
Primer里面的原句贴上来吧:
我们可以如下指定一个初始值
int *pi = new int( 1024 );
它不但分配了这个对象而且用1024 将其初始化
要动态分配一个对象数组我们可以写成
int *pia = new int[ 10 ];
()表示指定初值,为一个数组开辟空间还是要[]