【问题标题】:Why anonymous class can't access private methods and variables?为什么匿名类不能访问私有方法和变量?
【发布时间】:2020-03-27 15:12:45
【问题描述】:
package demo;

class Child{
    private static int a=50;
    public void fin() {
        System.out.println("hello");
    }
    private void fly() {
        System.out.println("lol");
    }
}

public class Hello {
    public static void main(String[] args) 
    {  
        Child c=new Child() {

            public void f() {
                System.out.println("sorry"+a);
            }
            public void fin() {
                System.out.println("hello");

            }

        };
        c.fin();

}}

上面是java的代码我的观点是为什么不能在匿名类中调用私有方法和变量,因为我在某处读到匿名类可以访问封闭类的所有成员。
https://www.baeldung.com/java-anonymous-classes go checkout 指定匿名类的每个成员都可以访问封闭类的所有成员。

【问题讨论】:

  • Lol 私有方法不能被覆盖......这没有任何意义,因为它们只在其定义的类中可见
  • 这就是 java 或任何其他面向对象语言的工作原理

标签: java inheritance anonymous-class


【解决方案1】:

该代码中有关于“内部类”和“匿名类”的混淆。

请注意,那里有 3 个课程:

  • Child
  • Hello
  • Hello$1:在Hello 内部声明的匿名类,其父类为Child

代码中的混淆是关于后者的:

  • Hello$1Child 的子类
  • Hello$1Hello 的内部类

这意味着:

  • Hello$1 无法从 Child 访问私有字段,因为子类无法访问其超类的私有元素
  • Hello$1 可以从 Hello 访问私有字段,因为匿名内部类可以访问其封闭类的私有元素

在这段代码中更清楚地检查它:

class Child {
    private int a = 50;
}

public class Hello {
    private int b = 60;

    public void f() 
    {  
        Child c = new Child() {
            public void f() {
                // System.out.println("a = " + a); // This won't compile
                System.out.println("b = " + b); // This compiles OK
            }
        };
    }
}

【讨论】:

  • 哦,非常感谢你兄弟,我完全误解了,,
【解决方案2】:

您匿名覆盖类的事实与这种情况无关紧要。类不能访问其父级的private 成员。如果您想访问父级的成员,您可以使用protected 或默认可见性来定义它们。

【讨论】:

    【解决方案3】:

    我在某处读到匿名类可以访问封闭类的所有成员。

    我假设你的意思是封闭类,是的。但是Child 不是封闭类,它是父类。在您的情况下,封闭类将是Hello.class,如果您添加到它private static int a;,即:

    public class Hello {
        private static int a = 40;
    ...
    

    它会起作用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 2013-09-03
      • 1970-01-01
      • 2010-10-28
      • 2023-04-04
      • 2018-09-04
      相关资源
      最近更新 更多