当前位置: 首页 > 面试题库 >

封闭类与声明类

万俟靖
2023-03-14
问题内容

在什么情况下Class.getDeclaringClass可能会得出与之不同的结果Class.getEnclosingClass

我认为这可能与外部类的子类实例化一个未声明为静态的内部类有关,但我无法以这种方式获得区别:

public class Main {
  private static class StaticInnerClass {

  }

  private class MemberInnerClass {

  }

  private static class ChildClass extends Main {

  }

  public MemberInnerClass getMemberInnerClassInstance() {
    return new MemberInnerClass();
  }

  public static void main(String[] args) {
    System.out.println( StaticInnerClass.class.getDeclaringClass() );
    System.out.println( StaticInnerClass.class.getEnclosingClass() );
    System.out.println( MemberInnerClass.class.getDeclaringClass() );
    System.out.println( MemberInnerClass.class.getEnclosingClass() );
    System.out.println( new ChildClass().getMemberInnerClassInstance().getClass().getEnclosingClass() );
    System.out.println( new ChildClass().getMemberInnerClassInstance().getClass().getDeclaringClass() );
  }
}

输出:

class Main
class Main
class Main
class Main
class Main
class Main

问题答案:

在此处找到http://kickjava.com/1139.htm#ixzz1mv2nEWg7:

“具有getDeclaringClass的替代项是,在Java语言规范中,匿名内部类不计为类的成员,而命名内部类为。因此,此方法为匿名类返回null。替代方法getEnclosingClass对匿名和命名类均有效。”

例如:

public class Test {
    public static void main(String[] args) {
        new Object() {
            public void test() {
                System.out.println(this.getClass().getDeclaringClass()); //null
                System.out.println(this.getClass().getEnclosingClass()); //not null
            }
        }.test();
    }
}

方法范围内的非匿名类也是如此:

class Foo {
  Class<?> bar() throws NoSuchFieldException {
    class Bar<S> { }
    return Bar.class;
  }

  static void main(String[] args) throws NoSuchFieldException {
    System.out.println(new Foo<Void>().bar().getDeclaringClass()); // null
    System.out.println(new Foo<Void>().bar().getEnclosinglass()); // Foo
  }
}


 类似资料:
  • 问题内容: 对我的头衔表示歉意,我无法正确表达问题。 我已经看到有两种实现方式。首先通过表示您的类已实现来完成。第二个任务是让您自己声明完成任务。 为什么在第一种选择中,您可以简单地将其作为参数,而在第二种选择中,则必须麻烦自己创建对象? 首先: 第二: 问题答案: 在第一种方法中, 整个Activity类都 实现了该接口。您可以将每个View的设置 为此 ,并通过一种方法接收所有click事件,

  • 我是 Kotlin 的新手,我有以下疑问 - 使用Java到Kotlin转换器(此链接),我将以下Java代码转换为Kotlin。 Java类: 生成的Kotlin类: 但是我不明白Java代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。 我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和sett

  • 问题内容: 我们可以在Objective-C中声明以下块。 我试图迅速做到这一点,它给错误。 错误:使用未声明的“ completionFunction” 定义: 这该怎么做? 更新: 根据@jtbandes的回答,我可以创建带有多个参数的闭包,例如 问题答案: 在对函数类型的语法是。 请注意,从Swift 3+开始,仅需在输入类型周围加上括号。

  • 我正在尝试制作一个俄罗斯方块游戏,我得到了编译器错误 当我尝试创建对象时 我对每个形状都使用内部类。这是我的部分代码 我做错了什么?

  • 本文向大家介绍C++中声明类的class与声明结构体的struct关键字详解,包括了C++中声明类的class与声明结构体的struct关键字详解的使用技巧和注意事项,需要的朋友参考一下 class class 关键字声明类类型或定义类类型的对象。 语法 参数 template-spec 可选模板说明。 ms-decl-spec 可选存储类说明有关更多信息 tag 给定于类的类型名称。在类范围内的

  • 当我试图运行我的BMI计算器时,我经常遇到这样一个错误“Cannot resolve method'println(java.lang.String,double)”当我试图运行我的BMI计算器时,我如何为一个double类型的变量声明一条语句?请帮帮我。这是我代码的链接