方法的重写要遵循“两同两小一大”规则
“两同”即方法名相同,形参列表相同;
“两小”指的是子类方法返回值类型应该比父类方法返回值类型更小或者相等,子类方法声明抛出的异常比父类方法声明的异常类更小或相等;
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
尤其要指出的是,覆盖方法和覆盖方法要么都是类方法(静态)要么都是实例方法,不能一个是类方法,一个是实例方法。例如:
class BaseClass{
public static void test(){...}
}
class SubClass extends BaseClass{
public void test(){...}
}
会引发编译错误。
如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。如果子类中定义了一个与父类private方法具有相同的方法名,相同的形参列表,相同的返回值类型的方法,依然不是重写,而是在子类中重新定义 了一个新方法。例如:
class BaseClass{
private void test(){...}
//test()方法是private访问权限,子类不可访问该方法
}
class SubClass extends BaseClass{
public static void test(){...}
//此处并不是方法重写,所以可以加static
}
--------------------------------------------------------------------------------------------------------------------------------------------
this不能出现在static修饰的方法中,super也不能出现在static修饰的方法中。
如果子类里没有包含和父类同名的成员变量,那么在子类实例方法中访问该成员变量时,则无须显示使用super或父类名作为调用者。如果在某个方法中访问名为a的成员变量,但没有显示指定调用者,则系统查找a的顺序为:
(1):查找该方法中是否有名为a的局部变量
(2):查找当前类中是否包含名为a的成员变量。
(3):查找a的直接父类中是否含有名为a的成员变量,依次上溯a的所有父类,知道java.lang.Object类。中如果最终不能找到名为a的成员变量,则系统出现编译错误