代码之家  ›  专栏  ›  技术社区  ›  Bad Request

在这段代码中,如何选择一种方法而不是另一种方法?

  •  6
  • Bad Request  · 技术社区  · 15 年前

    这是SCJP的另一个问题。下面的代码打印出来 Alpha:fooBeta:fooBeta:barBeta:bar ,我不明白为什么第一个foo调用选择Alpha的foo而不是Beta的阿尔法·福参数更改为String而不是String…,则输出为 Beta:fooBeta:fooBeta:barBeta:bar 这是有道理的。

    Alpha a = new Beta(); ,编译器将检查阿尔法·福,但JVM将实际运行测试版foo. 首先,Beta确实有一个foo方法,其签名与调用匹配。另一方面,我认为varargs方法只在没有其他方法与调用匹配时运行。所以我认为这是两个原因阿尔法·福不应该跑。这种理解的哪一部分是错误的?

    谢谢!

    class Alpha {
    
        public void foo(String... args) { //if this were String args, then it makes sense
            System.out.print("Alpha:foo");
        }
    
        public void bar(String a) {
            System.out.print("Alpha:bar");
        } }
    
    public class Beta extends Alpha {
    
        public void foo(String a) {
            System.out.print("Beta:foo");
        }
    
        public void bar(String a) {
            System.out.print("Beta:bar");
        }
    
        public static void main(String[] arg) {
            Alpha a = new Beta();
            Beta b = (Beta) a;
            a.foo("test");//confusing line
            b.foo("test");
            a.bar("test");
            b.bar("test");
        } }
    

    编辑:我想我知道我现在在哪里误解了事情。我想在一个 SuperClass sc = new SubClass(); 编译时和运行时,除非子类提供了方法的“更好”版本。然后,即使在编译时,编译器也会知道要调用的方法是子类版本。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    方法重载是在编译时实现的,方法重写是在运行时实现的。

    就你而言 foo 在里面 Beta @Override

    Alpha#foo(..) 引用 贝塔 -即。 b.foo("test") this question

        2
  •  6
  •   Kirk Woll    15 年前

    一种具有 String[] String... 参数和具有 String foo 在那里找到的方法。这个 Beta中的方法没有被调用,因为它实际上不是Alpha版本的重写。

    (这是 @Override 注解很方便。如果你想在测试版的 ,则会出现编译器错误。)

        3
  •  2
  •   Benoit Courtine    15 年前

    由于a和b“foo()”方法没有相同的签名,因此b“foo()”方法 重写“foo()”方法。

    因此,当您调用“a.foo()”时,阿尔法·福().

        4
  •  2
  •   sushil bharwani    15 年前

    当您说Super a=new Sub();并执行a.methodCall()时,将应用以下规则。。

    查看子类是否有重写超类中的方法并调用它的方法。

    但在这里,子类中的方法不重写,而是重载超类中的方法,因此调用了超类的实现。当你对这两个方法做参数的时候是一样的。那么最重要的原则就适用了。

        5
  •  0
  •   giri    15 年前

    重写发生在运行时,在您的情况下,这里您没有重写 foo String[] or String... 参数和带有字符串参数的方法不同。