我知道Java方法可以在同一类或子类中重载的事实。
但是我可以在非子类中重载Java静态方法吗?
我对下面的代码有些困惑。
class A {
public static void main(String[] args) {
System.out.println("Inside main's (String[]) method");
}
}
class B {
public static void main(int[] args) { // [1, 2, 3]
System.out.println("Inside main's (int[]) method");
}
}
public class _2b_Overloading_Staticmethod_NonSubClass {
// JVM's entry point
public static void main(String[] args) {
A.main(args);
B.main(new int[]{1,2,3});
}
}
答案 0 :(得分:2)
我知道Java方法可以在同一方法中重载的事实 类或子类中。
正确。如果同一类中的多个函数共享相同的名称,但其参数不同,则认为该方法已重载。
public class A
{
public void foo(int param)
{
}
public void foo(string param)
{
}
}
但是我可以在非子类中重载Java静态方法吗?
可以。子类是从父类(也称为超类)继承属性的类。如果类是子类而不是子类,或者方法是静态的,则没有禁止方法重载的规则。
public class A
{
public static void foo(int param)
{
}
public static void foo(string param)
{
}
}
但是,您问题中的上述代码不是方法重载的示例,因为具有相同名称(主)的方法未包含在同一类/作用域中。但是,它们的参数列表确实有所不同,但这并没有任何后果。
答案 1 :(得分:1)
此外,还提供了来自JLS的一些备份,以及大量示例。
来自JLS § 8.4.9:
如果一个类的两个方法(都是在同一个类中声明的,或者都是由一个类继承的,或者一个声明且是一个继承的)具有相同的名称,但签名不是等效的,则该方法的名称为据说超载。
这对静态成员很重要...
class Foo {
static int someStaticMethod(String s) {
return 0;
}
static int someStaticMethod(String s, boolean b) {
return 0;
}
}
...以及非静态的:
class Foo {
int someMethod(String s) {
return 0;
}
// Method overloading
int someMethod(String s, boolean b) {
return 0;
}
}
如果一个类从另一个类继承一个方法,也会发生重载:
class Bar extends Foo {
// This is also a case of overloading, because Bar inherits
// someMethod(String) from Foo
int someMethod(String s, double d, boolean b) {
return 0;
}
}
如果两种方法都无关,尽管它们的名称相同,则永远不要说它们已重载。。
两种非静态方法就是这种情况
class Alpha {
void anotherMethod(String s) { }
}
class Bravo {
// No overloading involved
void anotherMethod(boolean b) { }
}
以及静态方法:
class Charlie {
static void someThirdMethod(String s) { }
}
class Delta {
// No overloading involved
static void someThirdMethod(boolean b) { }
}
对于静态成员,即使其中一个类继承另一个也是如此:
class Echo {
static void lastMethod(String s) { }
}
class Foxtrot extends Echo {
// No overloading involved. Static members are never inherited,
// so effectively, these two methods are unrelated
static void lastMethod(boolean b) { }
}