Java:嵌套类中的重复方法签名

时间:2017-11-15 09:32:46

标签: java

希望这个问题还没有被问到。我环顾四周但没找到类似的帖子。

在Java中进行实验我注意到在嵌套类中使用重复的方法签名没有任何限制,这似乎是违反直觉的。

例如,如果我创建包含签名为int x()的方法的A类,然后添加包含相同方法的嵌套类B,则编译器似乎没有问题。我最初的假设是,它会抱怨x已经定义。也许我错过了一些明显可以解释为什么允许这样做的东西?

class A {
    int x() {
        return 1;
    }

    class B {
        int x() {
            return 2;
        }
    }
}

随后,有没有办法从B类范围内访问A类的方法x,还是被本地范围的方法x永久隐藏?

编辑:我感谢问题的核心与this post相同,但是,我更感兴趣的是理解为什么允许这种行为,因为我不能立即清楚这一行为。

10 个答案:

答案 0 :(得分:1)

在哪里定义一个类并不重要。请记住,最后你有

class A { int x()

class A.B { int x()

两个(几乎)独立的课程。我们这里唯一的关系是B的任何一个实例需要一个"封闭"它所属的A的实例(因为它是一个非静态的内部类)。

当然,您可以访问"封闭" A"东西"从B中开始,例如使用A.this.x()

答案 1 :(得分:0)

这应该可以在ImageView icon = findViewById(R.id.icon); ColorStateList tint = getResources().getColorStateList(R.color.color_bottom_navigation_item); Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_music_note_white_24dp); drawable = DrawableCompat.wrap(drawable).mutate(); DrawableCompat.setTintList(drawable, tint); icon.setImageDrawable(drawable); 中找到 - 但最终归结为范围。它们中的每一个都有一个不同的范围 - 因此编译器不会抱怨。

答案 2 :(得分:0)

它的范围,它类似于一个名为foo的实例变量,然后是名为foo的方法中的本地变量。

值得一读scope in java

答案 3 :(得分:0)

为什么编译器会抱怨?它们是两个不同的类,它们恰好是嵌套的。

答案 4 :(得分:0)

  

随后,有没有办法从B类范围内访问A类方法x,或者它是否被本地范围的方法x永久隐藏?

A.this.x()

答案 5 :(得分:0)

首先,方法签名不是返回类型和方法名称的组合,而是方法名称和参数。

如果你调用x(),它将在B

中运行x()

A.this.x();它将在A

中运行x()

答案 6 :(得分:0)

java中的内部类可以访问所有成员(即变量和方法),包括私有成员,但外部类不能直接访问内部类的成员。

要在A类中访问B类的x()方法,您可以创建B的实例并调用它或像这样调用A.this.x();

要访问A类以外的x()方法,您可以执行以下操作:

B b = a.new B();
b.x();

答案 7 :(得分:0)

如果您使用的是非静态嵌套类(内部类),那么它将无法从其他类访问B类的x方法。但是,如果您使用的是静态嵌套类,则可以从其他类访问该方法。例如:

public class A {

    int x() {
        new A.B().x();
        return 1;
    }

    static class B {
        int x() {
            new A().x();
            return 2;
        }
    }
}


public static void main(String[] args) {
        A a = new A();
        a.x();
        B b = new A.B();
        b.x();
}

我希望这个例子回答你的问题...☺

答案 8 :(得分:0)

B嵌套在A中。根据范围规则,我们可以执行以下操作:

class A {
    int x() {
        return 1;
    }

    class B {
        int x() {
            return 2;
        }

        int xOfA(){
            return A.this.x();
        }
    }

    public static void main(String[] args) {
        final A objA = new A();
        final B objB = objA.new B();
        System.out.println(objA.x());
        System.out.println(objB.x());
        System.out.println(objB.xOfA());
    }
}

这是因为B从A的实例中可见。 此外,B可以通过其完整路径引用包含类中的方法。

答案 9 :(得分:-1)

  

例如,如果我创建包含带有签名int x()的方法的A类,然后添加包含相同方法的嵌套类B,则编译器似乎没有问题。我最初的假设是它会抱怨已经定义了x。也许我错过了一些明显可以解释为什么允许这样做的东西?

当你在一个嵌套作用域中定义一些东西,否则它在外部作用域中,这是隐藏的。 重要的是 - :执行的方法版本不会由用于调用它的对象决定。实际上,它将取决于用于调用方法的引用变量的类型

  

随后,有没有办法从B类范围内访问A类的方法x,或者它是否被本地范围的方法x永久隐藏?

因此从上面可以清楚地看到我们可以使用类名来访问它,例如A.x

希望这会有所帮助!!