希望这个问题还没有被问到。我环顾四周但没找到类似的帖子。
在Java中进行实验我注意到在嵌套类中使用重复的方法签名没有任何限制,这似乎是违反直觉的。
例如,如果我创建包含签名为int x()
的方法的A类,然后添加包含相同方法的嵌套类B,则编译器似乎没有问题。我最初的假设是,它会抱怨x
已经定义。也许我错过了一些明显可以解释为什么允许这样做的东西?
class A {
int x() {
return 1;
}
class B {
int x() {
return 2;
}
}
}
随后,有没有办法从B类范围内访问A类的方法x
,还是被本地范围的方法x
永久隐藏?
编辑:我感谢问题的核心与this post相同,但是,我更感兴趣的是理解为什么允许这种行为,因为我不能立即清楚这一行为。
答案 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
希望这会有所帮助!!