Java 静态内部类和类的静态成员共享相同的名称?
静态内部类Java 静态内部类和类的静态成员共享相同的名称?,java,static-methods,static-members,Java,Static Methods,Static Members,静态内部类M和静态成员M[类C]如何共享相同的名称 以下代码生成“白色”作为输出: public class Amazed{ public static void main(String[] args) { System.out.println(B.M.W); } } class B { public static class M { static String W = "Black"; } static
M
和静态成员M
[类C
]如何共享相同的名称
以下代码生成“白色”作为输出:
public class Amazed{
public static void main(String[] args) {
System.out.println(B.M.W);
}
}
class B {
public static class M {
static String W = "Black";
}
static C M = new C();
}
class C {
String W = "White";
}
如何访问成员对象而不是静态类成员:W[“Black”]
如果我想访问静态类M中的成员,该怎么做?在可以实例化
M
的特定情况下,您可以使用静态可以以非静态方式访问的事实:
public class Amazed{
@SuppressWarnings("static-access")
public static void main(String[] args) {
B.M val = new B.M();
System.out.println(val.W);
}
}
class B {
public static class M {
static String W = "Black";
}
static C M = new C();
}
class C {
String W = "White";
}
上面将打印“黑色”,因为您通过
B.M
的实例引用标识符来消除其歧义。当然,在生产代码中这绝不是一个好主意,因为不应该以非静态方式访问静态字段。同样,它要求您创建B.M
的实例 该变量模糊了相同名称的类型。如果名称可以解释为变量或类型,则首选该变量
您可以通过不给他们相同的名字来避免这种情况
根据Java语言规范:
6.4.2。遮蔽
简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5的规则规定,变量的选择优先于类型,类型的选择优先于包。因此,有时可能无法通过其简单名称引用可见类型或包声明。我们说,这样一项声明是模糊的
(特别是)详细阐述了Java如何在特定上下文中整理特定标识符的含义。规则相当复杂,但粗略地说,Java有六个名称空间:
- 包名称
- 类型名称
- 字段(变量)名称
- 方法名
- 局部变量名称(包括参数)
- 标签
代码混淆器利用这一点非常有利,最终可以得到名为
a.a
的包和名为a
的类(该类也将被标识为a.a
)。更不用说像do
和for
这样的Java关键词是.class文件中的合法名称(但不是在Java源代码中)。这有助于使逆向工程成为一个真正的熊。在大家的帮助和小游戏之后,我发现即使不为内部类创建对象,我们也可以访问成员W“Black”
简单地使用这个语句
M.W
但我不知道访问级别。[因为它是公共的?]即使没有公共的,它也能工作。怎么样?我喜欢这种方法
meth
对你毫无帮助。不过,长时间的while循环可能更合适。@thattidotguy:或者是一些递归的东西,直到它破坏堆栈。谢谢BMT。但我不明白模糊和重新分类的规范。。。有人能帮我一下吗?@Dineshkumar访问字段的方式有优先权。如果你感到惊讶,请阅读这篇文章,了解它是如何被选择的?优先顺序是什么?1)变量2)类型3)包名此处的类型是否表示类以外的任何类型?它表示任何类型,包括类和接口。基元类型是关键字,因此不能将其用作变量名。