【问题标题】:are static and non static overloads each other是静态和非静态重载
【发布时间】:2015-04-12 02:48:59
【问题描述】:

这两个函数是否重载

class yogi{

   public static void fun(){
    System.out.println("Fun");
   }    

   public void fun(int a,int b){
    System.out.println("int");
   }

}

【问题讨论】:

  • 你不能有这样的重载。它们的称呼完全不同。 yogi.fun()myYogiInstance.fun().
  • @Phylogenesis:你绝对可以拥有这样的重载。您希望看到什么错误?仅仅因为它们被称为不同并不意味着它们不是重载。
  • 我不会称之为方法重载。这是我有问题的命名法。
  • @Phylogenesis: 那么你应该按照规范来学习它:)
  • @Phylogenesis: 我也是 :) (我知道反过来,这很烦人。我讨厌能够“通过”实例调用静态方法......)

标签: java overloading


【解决方案1】:

是的,这些都是重载。来自JLS 8.4.9

如果一个类的两个方法(无论是在同一个类中声明,还是都由一个类继承,或者一个声明一个继承)具有相同的名称但签名不是覆盖等效的,那么方法名称是说是超载了。

静态方法和实例方法使用相同名称是一个好主意,这种情况很少见 (IMO),但它完全有效。

有趣的是,这可能会导致重载解决问题,因为即使没有实例可以调用该方法,也会包含实例方法。例如:

public class Test {
    public void foo(String x) {
    }

    public static void foo(Object x) {
    }

    public static void bar() {
        foo(""); // Error
    }
}

规范可以被设计成这样就可以了(并调用静态方法),但这是一个错误:

Test.java:9: error: non-static method foo(String) cannot be referenced
                    from a static context
        foo("");
        ^

【讨论】:

    【解决方案2】:

    我认为是的。它们重载了方法名称“fun”。

    Some good points about overloading can be found here

    "方法重载也称为静态多态。

    注意事项:
    1. 静态多态也称为编译时绑定或早期绑定。
    2. 静态绑定发生在编译时。方法重载是静态绑定的一个示例,其中方法调用与其定义的绑定发生在编译时。"

    例如下面的代码给出了编译时错误: Duplicate method fun(int, int) in type ...

    public static void fun(int a, int b) {
        System.out.println("int");
    }
    
    public void fun(int a, int b) {
        System.out.println("int");
    }
    

    从编译时绑定的角度来看,实例方法和静态方法不能分开,因为静态方法也可以在实例变量上调用,而不仅仅是在类引用上。并且编译器必须明确地解析。

    【讨论】:

      最近更新 更多