方法的签名包括两部分,方法名和参数列表。
如果在子类中定义了一个与父类签名相同的方法,那么子类中的这个方法就会覆盖父类中这个相同签名的方法。这里需要注意一点,在覆盖一个方法的时候,子类方法不能低于父类方法的可见性,比如一个同样方法签名的方法在父类中的修饰符是 public
,而在子类中是 private
。
但是需要注意的是,返回类型并不是方法签名的一部分,所以,在覆盖方法的时候,一定要保证返回类型的兼容性,允许子类将覆盖方法的返回类型定义为原返回类型的子类型。
假设,这里有一个类A,其中有方法f,当这个类A创建一个实例a并调用f时, a.f(args)
时有一些细节需要注意:
f(int)
和方法 f(String)
。编译器将会一一列举所有C类中名为f的方法和其父类中访问属性为 public
且名为f的方法(需要注意的是,父类的私有方法不可访问)。a.f("Hello")
来说,编译器将会挑选 f(String)
,而不是 f(int)
。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,编译器就会报错。private
方法, static
方法, final
方法或者构造器,那么编译器将可以准确的知道调用哪个方法,我们将在这种方式称为静态绑定,而与之对应的是之前我们提过的调用的方法依赖于隐式参数的实际类型,并且在运行的时候实现动态绑定。final关键字