Java 匿名类的方法行为异常
匿名类的方法的行为异常。Java 匿名类的方法行为异常,java,Java,匿名类的方法的行为异常。 如何使方法sout打印“sout”,现在它打印“main”问题是String getName()是private 这意味着派生类的方法无法访问它 但是,匿名派生类不仅是派生的,而且是内部类。因此,类可以访问外部类的私有成员。这就是为什么打印的是main,而不是sout 要使该方法起作用,只需将该方法设置为非私有:默认访问、受保护的、或公共的都可以 您将使用 public class Solution { private String name; Sol
如何使方法sout打印“sout”,现在它打印“main”问题是
String getName()
是private
这意味着派生类的方法无法访问它
但是,匿名派生类不仅是派生的,而且是内部类。因此,类可以访问外部类的私有成员。这就是为什么打印的是main
,而不是sout
要使该方法起作用,只需将该方法设置为非私有:默认访问、受保护的
、或公共的
都可以
您将使用
public class Solution {
private String name;
Solution(String name) {
this.name = name;
}
private String getName() {
return name;
}
private void sout()
{
new Solution("sout")
{
void printName()
{
System.out.println(getName());
}
}.printName();
}
public static void main(String[] args) {
new Solution("main").sout();
}
}
我在回答一个关于
静态
案例的问题时浏览了规范,这也解释了为什么这里会打印“main”
。您应该提供比“意外行为”更多的信息。研究帮助中心,了解您应该在问题中添加什么。我怀疑这与以下事实有关:getName
是私有的,匿名类无法访问其超类的私有方法,但它可以访问其封闭类的私有方法。。。这两个类是同一个类,这让问题变得复杂。你在哪里找到这段代码的?真奇怪。你也在这样做:@immibis你是对的。问题是private
@Artur Arsalanov为什么要将getter方法私有化,这有什么意义?是的,问题似乎是私有的。非常感谢。已解决。@ArturArsalanov如果在保持getName()
私有的同时使用this.getName()
,代码将不会编译()。但如果不是私有的,则可以使用此.getName()运行;但是如果没有这个-仍然打印“main”@ArturArsalanov,请查看答案底部的演示。它与您发布的代码的唯一区别是在getName
前面删除了private
。这就足够了,因为当外部上下文和派生上下文都提供方法时,继承的方法“获胜”。
System.out.println(super.getName());
class Example {
private void sayHello() {
System.out.println();
}
static class Subclass extends Example {
Subclass() {
// This is a compiler error
// because it tries to call sayHello()
// on an enclosing instance which doesn't
// exist (as if Subclass is an inner class).
sayHello();
}
}
}