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

静态嵌套类和常规类之间的区别

尉迟京
2023-03-14
问题内容

我知道这是一个重复的问题,但是我想以一种非常具体的方式提出这个问题,以阐明一个非常重要的观点。主要问题是:如果一个相同的类是静态嵌套类,而另一个是常规的顶层类,而不是访问包含类中的私有静态字段,则这些相同的类之间是否有任何区别?

// ContainingClass.java
public class ContainingClass {
    private static String privateStaticField = "";

    static class ContainedStaticClass {
        public static void main(String[] args) {
            ContainingClass.privateStaticField = "new value";
        }
    }
}

// OutsideClass.java
public class OutsideClass {
    public static void main(String[] args) {
        ContainingClass.privateStaticField = "new value";  // DOES NOT COMPILE!!
    }
}

换句话说:ContainedStaticClass可以直接访问的内容与可以直接访问的内容之间唯一唯一的区别OutsideClassOutsideClass不能ContainingClass.privateStaticField直接访问吗?还是存在其他通常不会讨论或遇到的细微差别?


问题答案:

您的说法是正确的:静态类和外部类之间的唯一区别是对类和封闭类成员的访问。所述static关键字被宣布该类不是一个内部类:它实际上是封闭类的范围内的外类。

参见https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.5.1



 类似资料:
  • 问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函

  • 我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

  • 问题内容: 静态类和单例模式之间存在什么真正(即实用)的区别? 两者都可以不实例化地调用,都只提供一个“实例”,并且它们都不是线程安全的。还有其他区别吗? 问题答案: 是什么让您说单例或静态方法不是线程安全的?通常,两者 都应 实现为线程安全的。 单例和一堆静态方法之间的最大区别在于,单例可以实现接口(或从有用的基类派生,尽管根据我的经验,这种情况不那么常见),因此您可以将单例当作“只是另一个实施

  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。

  • 问题内容: 用修饰的功能和用修饰的功能有什么区别? 问题答案: 也许有点示例代码将有助于:发现其中的差别在调用签名,并且: 以下是对象实例调用方法的常用方法。对象实例,a作为第一个参数隐式传递。 使用时,对象实例的类作为第一个参数而不是隐式传递。 你也可以使用该类进行呼叫。实际上,如果你将某些东西定义为类方法,则可能是因为你打算从类而不是从类实例调用它。本来会引发,但效果很好: 人们发现类方法的一

  • 问题内容: 给定跟随类层次结构,以下语句的动态和静态类型是什么? 类层次结构: 对于以下每个语句,静态类型?动态类型?: 我 知道我的答案/问题将是静态和动态类型的Fruit。 在编译时将为Alpha类型(静态),在运行时将为Fruit类型(动态)。 在编译时将为Gamma类型(静态),在运行时将为Fruit类型(动态)。 但是我不知道其他两个答案。Beta b = f是一个实例,其中同一超类的两