1

如果内部类有一个与外部类同名的函数,它是隐藏覆盖还是重载?

例如,我正在谈论这样的情况(本地类):

class A{
    void f(){
        class B{
            void g(){..}
            ...
        }
    }
    void g() {...}
}

我似乎找不到这个问题的答案。

您能否指出匿名、静态、内部和本地类之间的答案是否存在差异?

这个关于 C++ 中嵌套类的问题的答案是什么?

4

4 回答 4

1

在 Java 的情况下,答案隐藏在您命名的所有情况下。但是,您仍然可以使用该语法从内部上下文访问外部方法:A.this.g().

于 2013-10-19T15:24:03.970 回答
0

注意:我刚刚注意到问题是询问两种截然不同的语言。此答案仅涵盖 C++;我不知道它是否适用于Java。

它是隐藏覆盖还是重载?

它是隐藏的:您在内部范围内声明的内容与外部范围内的内容同名。外部范围内的名称不再可以通过非限定查找访问,尽管它可以作为限定名称访问A::g

当派生类声明一个与基类中的虚函数具有相同名称和兼容参数的函数时,就会发生覆盖(除了隐藏之外)。

当您在同一范围内声明多个具有相同名称(但参数不同)的函数时,就会发生重载。

您能否指出匿名、静态、内部和本地类之间的答案是否存在差异?

没有区别(也没有 C++ 中的“静态类”之类的东西)。所有类都引入了它们自己的作用域,在它们声明的任何作用域内。

这个关于 C++ 中嵌套类的问题的答案是什么?

完全相同的。嵌套类的作用域在外部类内部,并且在那里声明的名称将隐藏在外部作用域中的名称。

于 2013-10-19T14:35:50.963 回答
0

如果内部类有一个与外部类同名的函数,它是隐藏覆盖还是重载?

当您在嵌套范围中定义某些东西时,否则它会在外部范围中,这是隐藏的。

您能否指出匿名、静态、内部和本地类之间的答案是否存在差异?

它纯粹基于范围规则。一个更简单的例子是

private final int i;

public void method() {
   long i = 1234; // local variable `i` hides the field.
于 2013-10-19T15:35:51.053 回答
0

它是隐藏的,除非嵌套类扩展了外部类,在这种情况下,它在两种语言中都是覆盖的。匿名/静态/本地没有任何区别。

于 2013-10-19T20:24:36.727 回答