在Oracle的Java教程中,我找到了以下文本:
与类方法和变量一样,静态嵌套类与其外部类关联。和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法--它只能通过对象引用来使用它们。
注意:一个静态嵌套类与它的外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了方便打包,它已经嵌套在另一个顶级类中。
我认为不可能实例化一个静态类,所以我不太理解粗体的句子。
你知道这是什么意思吗?
正如kihero所说,您要么将static
与abstract
混淆,要么将概念与具有static
方法的类混淆(这只是一个碰巧具有静态方法的类)。
静态嵌套类只是一个不需要其封闭类的实例的嵌套类。如果您熟悉C++,C++中的所有类都是“静态”类。在Java中,嵌套类默认情况下不是静态的(这种非静态类型也称为“内部类”),这意味着它们需要外部类的一个实例,它们在幕后的隐藏字段中跟踪外部类--但这允许内部类引用其关联的封闭类的字段。
public class Outer {
public class Inner { }
public static class StaticNested { }
public void method () {
// non-static methods can instantiate static and non-static nested classes
Inner i = new Inner(); // 'this' is the implied enclosing instance
StaticNested s = new StaticNested();
}
public static void staticMethod () {
Inner i = new Inner(); // <-- ERROR! there's no enclosing instance, so cant do this
StaticNested s = new StaticNested(); // ok: no enclosing instance needed
// but we can create an Inner if we have an Outer:
Outer o = new Outer();
Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
}
}
关于如何在静态方法中实例化非静态内部类的许多其他示例
问题内容: 在Oracle的Java 教程中,我找到了以下文本: 与类方法和变量一样,静态嵌套类与其外部类相关联。与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法-它只能通过对象引用来使用它们。 注意:静态嵌套类与它的外部类(和其他类)的实例成员进行交互,就像其他任何顶级类一样。实际上,静态嵌套类在行为上是顶级类,为了包装方便,该顶级类已嵌套在另一个顶级类中。 静态嵌套类使用
问题内容: 我已经开始学习用于Android应用程序开发的Java语言。 根据我对静态类的理解,我们无法实例化静态类的对象。 但是,为什么在随后的情况下允许实例化静态嵌套类对象? 如果将内部类的对象标记为静态,为什么我们可以创建它呢? 问题答案: 根据我对静态类的理解,我们无法实例化静态类的对象。 您对“静态类”的含义的理解不正确。基本上, Java中 的“静态类” 是嵌套类,它没有对包含类的实例
但是为什么在下面的情景中允许静态嵌套类对象的实例化呢? 为什么我们可以创建内部类的对象,如果它被标记为静态的?
来自JavaScript背景,我发现以下代码有点过于健壮,包含多条语句;我想知道如何简化代码,并在一条语句中完成所有操作。 Student是超类,Friend和Schedule是聚合到超类ArrayList公共成员中的子类(这些不是嵌套类)。这是我当前的代码: 我想知道我是否可以做这样的事情,在一个语句中声明/实例化超类和子类;这可能吗?
问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函
我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?