Java 可以重载或重写静态方法吗
让我们先定义一下Overloading和Overriding。
Overriding :Overriding是像Java这样的OOP语言的一个特点,与运行时多态性有关。一个子类(或派生类)为超类(或基类)中的一个方法提供特定的实现。
要执行的实现是在运行时决定的,根据调用的对象来决定。注意,两个方法的签名必须是相同的。详情请参考《Java中的重载》。
重载 :重载也是像Java这样的OOP语言的一个特点,与编译时(或静态)多态性有关。这个特性允许不同的方法有相同的名字,但有不同的签名,特别是输入参数的数量和输入参数的类型。请注意,在C++和Java中,方法不能根据返回类型进行重载。
我们可以重载静态方法吗?
答案是 “可以”。我们可以有两个或多个名称相同的静态方法,但输入参数不同。例如,考虑下面的Java程序。
输出
在Java中,如果两个方法仅有静态 关键字 的不同,我们不能重载它们(参数数量和参数类型相同)。请看下面这个Java程序的例子。这种行为在C++中也是一样的(见本文第2点)。
输出
我们可以在java中覆盖静态方法吗?
我们可以在子类中声明具有相同签名的静态方法,但这不被视为覆盖,因为不会有任何运行时多态性。因此答案是 “不能”。
如果一个派生类定义的静态方法与基类中的静态方法具有相同的签名,那么派生类中的方法就会被基类中的方法所隐藏。
输出
以下是Java中方法覆盖和静态方法的一些要点。
1) 对于类(或静态)方法,根据引用的类型来调用方法,而不是根据被引用的对象,这意味着方法调用在编译时决定。
2) 对于实例(或非静态)方法,方法的调用是根据被引用对象的类型,而不是根据引用的类型,这意味着方法的调用是在运行时决定的。
3) 一个实例方法不能覆盖一个静态方法,一个静态方法不能隐藏一个实例方法。例如,下面的程序有两个编译器错误。
4) 在一个子类(或派生类)中,我们可以重载从超类继承的方法。这种重载方法既不隐藏也不覆盖超类的方法,它们是新的方法,对子类来说是独一无二的。
参考文献:
http://docs.oracle.com/javase/tutorial/java/IandI/override.html