当前位置: 首页 > 知识库问答 >
问题:

通过命名引用访问匿名对象的受保护方法vs

汪迪
2023-03-14

假设我有一个抽象类:

package test.one;

public abstract class One {
  
  protected abstract void whatever();

  public void run(){
    whatever();
  }
  
}

使用方法如下:

package test.two;

import test.one.One;

public class Three {

  public static void main(String[] args){
    One one = new One(){
      @Override
      protected void whatever(){
        System.out.println("Do whatever..");
      }
    };
    one.whatever();
  }

}

这段代码在编译时失败,这是意料之中的。

test/two/Three.java:14: error: whatever() has protected access in One
    one.whatever();
       ^
1 error

但以下代码编译成功,这似乎令人惊讶:

package test.two;

import test.one.One;

public class Two {

  public static void main(String[] args){
    new One(){
      @Override
      protected void whatever(){
        System.out.println("Do whatever..");
      }
    }.whatever();
  }

}

不同之处在于,在后一种情况下,我访问的方法没有命名引用。为什么编译器允许这样的访问?

共有1个答案

阴高刚
2023-03-14

不同之处在于,在后一种情况下,我访问的方法没有命名引用。为什么编译器允许这样的访问?

不,区别在于在后一种情况下,您是在匿名类上访问该方法,而不是在One类型的引用上访问该方法。

撇开受保护访问的奇怪之处不谈,只需使用公共方法创建一个匿名类,就可以很容易地看到区别:

java prettyprint-override">class Test {
    public static void main(String[] args) {
        // This is fine...
        new Object() {
            public void method() {
                System.out.println("Called");
            }
        }.method();
        
        // This is not, because Object doesn't contain a method called "method".
        Object o = new Object() {
            public void method() {
                System.out.println("Called");
            }
        };
        o.method();        
    }
}

如注释中所述,看到相同效果的另一种方法是使用var,因此变量的编译时类型是匿名类。

即使是匿名类中的私有成员也可以在包含范围内访问,就像它们是普通的嵌套类一样。

 类似资料:
  • 问题内容: 我有两节课。 类具有受保护的方法,是的实例。 Class 与class在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加

  • 描述 (Description) 当guard应用于名称空间时,仅当保护条件返回true时才使用由名称空间定义的mixin。 namespace guard与mixins上的namespace guard类似。 例子 (Example) 以下示例演示了在LESS文件中使用受guarded namespaces - <html> <head> <link rel = "styles

  • 我想允许对URL的匿名访问,仅限于特定的IP地址子网。 网址是: http://10.102.34.98:880/auth/tokens/revoke/blabla 其中 auth 是 Web 应用的上下文根。 访问IP地址10.102.34.98访问IP地址的子网掩码255.255.255.0trusted.client.subnet属性设置为10.102.34.0/24 匿名访问工作正常: 但

  • 问题内容: 在下面的代码中,Consumer类可以访问Parent类的受保护方法。由于Parent和Consumer类之间没有关系,这怎么可能。 谢谢 问题答案: 表示:相同的包或通过继承。由于您的课程都在(实际上不建议使用),因此可以进行访问。顺便说一句:如果您尝试测试Java访问控制,则会忘记(= no修饰符= )。 另一方面,访问是指:从该特定类(以及仍然是主机类成员的非静态内部类)之外的任

  • 经过前面的学习,我们知道创建对象的标准格式如下: 类名称 对象名 = new 类名称(); 每次 new 都相当于开辟了一个新的对象,并开辟了一个新的物理内存空间。如果一个对象只需要使用唯一的一次,就可以使用匿名对象,匿名对象还可以作为实际参数传递。 匿名对象就是没有明确的给出名字的对象,是对象的一种简写形式。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。 程序运

  • 本文向大家介绍使用伪命名空间封装保护独自创建的对象方法,包括了使用伪命名空间封装保护独自创建的对象方法的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇使用伪命名空间封装保护独自创建的对象方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。