疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

类的重写—[疯狂java讲义]


 

         如果定义一个Java类时并未显式指定这个类的直接父类,则这个类默认扩展java.lang.Object类。因此,java.lang.Object是所有类的父类,要么是其直接父类,要么是其间接父类。因此所有Java对象都可调用java.lang.Object类所定义的实例方法。
 
         从子类角度来看,子类扩展(extends)了父类;但从父类的角度来看,父类派生(derive)出了子类。也就是说,扩展和派生所描述的是同一个动作,只是观察角度不同而已。
 
重写父类的方法
 
        子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔的方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,为此,鸵鸟需要重写鸟类的方法。
 
        这种子类包含与父类同名方法的现象被称为方法重写,也被称为方法覆盖(Override)。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。
 
        方法的重写要遵循“两同两小一大”规则,“两同”即方法名相同、形参列表相同,“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常应比父类方法声明抛出的异常类更小或相等。“一大”指的子类方法的访问权限应比父类方法更大或相等,尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个实例方法。
 
        当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法,但还可以在子类方法中调用父类中被覆盖方法。如需要在子类方法中调用父类中被覆盖方法,可以使用super(被覆盖的是实例方法)或者父类类名(被覆盖方法是类方法)作为调用者来调用父类中被覆盖方法。
 
        如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。如果子类中定义了一个与父类private方法具有相同方法名,相同形参列表,相同返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法。(摘自[疯狂java讲义])