【问题标题】:overloading and hiding - differences [closed]重载和隐藏 - 差异[关闭]
【发布时间】:2014-05-11 08:28:08
【问题描述】:

我为 SCJP 做准备,我对 jls 的这个术语有点困惑。

关于从 jls 重载:

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

关于隐藏:

如果一个类 C 声明或继承了一个静态方法 m,那么 m 被称为 隐藏任何方法 m',其中 m 的签名是子签名 (§8.4.2) m'的签名,在超类和 C 的超接口,否则 C 中的代码可以访问这些超接口。

看起来隐藏只是静态方法重载的一部分。

但这些定义相当华丽。请澄清区别。

你能提供具体的例子来感受不同吗?

【问题讨论】:

  • 这个页面有更人性化的解释:docs.oracle.com/javase/tutorial/java/IandI/override.html
  • @Dave 在此页面解释覆盖(非重载)和隐藏
  • 嗯,重载是完全不同的;它有效地添加了一个新的、独特的函数,如果你发送正确的参数,两者都可以被调用。
  • 无关部分 - ** 注意:在子类中,您可以重载从超类继承的方法。这样的重载方法既不会隐藏也不会覆盖超类的实例方法——它们是新方法,是子类独有的。 **

标签: java methods static overloading encapsulation


【解决方案1】:

重载是指您有 2 个或多个具有相同名称但具有不同参数的方法。 http://en.wikipedia.org/wiki/Method_overloading

重写是指方法不是静态的并且名称和参数相同。

例如,

public class A {
   public void test1(String a) {System.out.println(a);}
}

public class B extends A {
   public void test1(String a) {System.out.println(a);}
}

然后您将覆盖方法 test1。

只有在两种方法都是静态的情况下才会发生隐藏。

隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

被调用的重写实例方法的版本是子类中的版本。 被调用的隐藏静态方法的版本取决于它是从超类调用还是从子类调用。

来自http://docs.oracle.com/javase/tutorial/java/IandI/override.html

【讨论】:

  • 我想你忘了告诉重载和隐藏/覆盖的 return 语句的不同意义
  • 我试图让它更简单,而不是完整。完整的详细说明在链接中。
【解决方案2】:

隐藏类似于Overriding(不是重载,区别很重要),但是用的是静态方法。看看下面的代码;

public class A {
    public static void do(){}
}
public class B extends A{
    public static void do(){}
}

这里,B 被称为 hiding 继承的 do() 方法,而不是覆盖它。如果您从do() 的两个方法声明中取出单词static,那么这是一个覆盖。调用哪个隐藏方法,完全取决于持有对象的引用类型,因为我们知道该方法属于类,而不是类创建的对象。所以从技术上讲,这样做是合法的;

A a = new B();
a.do();

但是(尽管a 持有一个B 对象)因为这是一个静态方法,所以上面的方法和这样做是一样的;

A.do();

另一方面,重载是当您更改方法的参数并创建另一个完全具有相同名称的合法方法时。例如。

public class A {
    public static void do(){}
}
public class B extends A{
    public static void do(String unicorn){}
}

现在,B 类正在重载 do 方法而不是隐藏它。将重载方法视为所有实际用途的全新方法,因为它就是这样。只要传递给方法的参数不同,Java 就会将其视为一个全新的方法。

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    重载是创建名称相同但签名不同的新方法。
    隐藏是在不同的类中创建具有相同名称和签名的静态方法。这很像覆盖,但保持对两个类级别方法的访问。
    因此,隐藏绝不是重载的一部分。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多