gpt4 book ai didi

java - 为什么这个静态内部类不能在其外部类上调用非静态方法?

转载 作者:IT老高 更新时间:2023-10-28 20:36:57 25 4
gpt4 key购买 nike

我目前正在阅读 Joshua Bloch 的 Effective Java,我喜欢它!但在第 112 页(第 24 项),布洛赫写道:

A static member class is the simplest kind of nested class. It is best thought of as an ordinary class that happens to be declared inside another class and has access to all of the enclosing class’s members, even those declared private.

这真的让我很困惑。我宁愿说:

A static member class is the simplest kind of nested class. It is best thought of as an ordinary class that happens to be declared inside another class and has access to all of the enclosing class’s static members, even those declared private.

这是一个片段,说明了我对引用的理解:

public class OuterClass {

public void printMessage(String message) {
System.out.println(message);
}

private static class InnerClass {

public void sayHello() {
printMessage("Hello world!"); //error: Cannot make a static reference to the non-static method printMessage(String)
}

}
}

可以看到 InnerClass 的 sayHello 方法无法访问 OuterClass 的 printMessage 方法,因为它是在静态内部类中声明的,而 printMessage 方法是一个实例方法。看起来作者建议静态成员类可以访问封闭类的非静态字段。我确信我在他的最后一句话中误解了一些东西,但我不知道是什么。任何帮助将不胜感激!

编辑:我更改了这两种方法的可见性,因为它与我的问题无关。我对静态成员感兴趣,而不是私有(private)成员。

最佳答案

仅仅因为InnerClassstatic,并不意味着它不能通过其他方式获得对OuterClass实例的引用,最常作为参数,例如

public class OuterClass {

private void printMessage(String message) {
System.out.println(message);
}

private static class InnerClass {

private void sayHello(OuterClass outer) {
outer.printMessage("Hello world!"); // allowed
}

}
}

如果 InnerClass 没有嵌套在 OuterClass 中,它就无法访问 private 方法。

public class OuterClass {

private void printMessage(String message) {
System.out.println(message);
}

}

class InnerClass {

private void sayHello(OuterClass outer) {
outer.printMessage("Hello world!"); // ERROR: The method printMessage(String) from the type OuterClass is not visible
}

}

关于java - 为什么这个静态内部类不能在其外部类上调用非静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com