Java(3-2)

①抽象类:
为什么花费精力去进行高层次的抽象呢?因为诸如学生、雇员都有姓名属性,因此可以将getName方法放置在位于继承关系较高层次的通用超类中。

在超类中的方法如果有abstract关键字,就完全不需要实现这个方法了。

为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象。
除了抽象方法之外,抽象类还可以包括具体数据和具体方法。
这里建议尽量将通用的域或者方法(不管是否抽象的)放在超类中(不管是否抽象类)。
扩展抽象类可以有两种选择。一种是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记为抽象类,另一种是定义全部的抽象方法,这样一来,子类就不是抽象类了。另外注意,抽象类不能被实例化。

这里再总结下Java用于控制可见性的4个访问修饰符:
1)仅对本类可见 —–private
2)对所有类可见—–public
3)对本包和所有子类可见——-protected
4)对本包可见——默认,不需要修饰符。

②Object:所有类的超类,hashcode方法:
Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要写成:public class Employee extends Object

如果没有指出超类,Object就被认为是这个类的超类。故Object类型变量可以引用任何类型的对象。

Object obj = new Employee("Harry Hacker",35000);

当然,object类型的变量智能用于作为各种值的通用持有者。要想对其中的内容进行具体的操作,还需要清楚对象的原始类型,并进行相应的类型转换:

Employee e = (Employee) obj;

在Java中,只有基本类型不是对象,所有数组类型,不管是对象数组还是基本类型的数组都扩展了Object类。

object类中的equals方法用于检测一个对象是否等于另一个对象,具体讲,在object类中,将判断两个对象是否具有相同的引用。如果Objcet类的两个对象具有相同的引用,那object类的equals方法就会返回true,否则false。

下面给出在,雇员为超类,经理为子类下的关于两个雇员对象的姓名、薪水、和雇佣日期都一样,就认为他是相等的代码:

public class Employee{
    ...
    public boolean equals(Object otherObject){
        if(this == otherObject) return true;
        if(otherObject == null)return false;
        if(getClass()!=otherObject.getClass())
            return false;
        Employee other = (Employee)otherObject;

        reutrn name.equals(other.name)&& salary == other.salary
        && hireDay.equals(other.hireDay)
    }
}

getClass方法将返回一个对象所属的类。注意,在子类中定义equals方法时,首先调用超类的equals。如果检测失败,对象就不可能相等。如果超类中的域都相等,就需要比较子类中的实例域。

public calss Manager extends Employee{
    ...
    public boolean equals(Object otherObject){
        if(!super.equals(otherObject)) return false;
        Manager other = (Manager)OtherObject;
        return bous == other.bonus;
    }
}

对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的数组元素是否相等。

下面给出一个完美的equals方法的建议:
1)显示参数命名为otherObject,稍后需要将他转换成另一个叫做other的变量。
2)检测this与otherObject是否引用同一个对象:
if(this == otherObject) return true;
3)检测otherObject是否为null,如果为null,返回false。
if(otherObject == null) return false;
4)比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测。
if(getClass()!=otherObject.getClass())return false;
5)将otherObject转换为相应的类类型变量:
ClassName other = (ClassName)otherObject
6)现在开始对所有需要比较的域进行比较了。使用==比较基本类型域。使用equals比较对象域。如果所有的域都匹配,就返回true,否则返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值