Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名类的方法行为异常_Java - Fatal编程技术网

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();
        }
    }
}