可以说是“方法重载”,其中两个没有关系的diff类(扩展)具有相同的方法名但参数类型不同吗?

时间:2019-05-14 07:36:18

标签: java overloading

我知道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});
    }
}

2 个答案:

答案 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) { }
    }
    

More about override-equivalence