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

如何在静态方法中实例化非静态内部类?

慕容康安
2023-03-14

我有以下代码:

public class MyClass {

   class Inner {
     int s, e, p;
   }

   public static void main(String args[]) {
     Inner in;
   }
}

到目前为止,代码还可以,但我无法在主方法中实例化'in',比如in=new internal(),因为它显示非静态字段不能在静态上下文中引用。

我能怎么做?我不想让我的内部类保持静态。


共有3个答案

傅新
2023-03-14

如果要从方法中创建new internal(),请从类MyClass的实例方法中创建:

public void main(){
  Inner inner = new Inner();
}

public static void main(String args[]){
  new MyClass().main();
}
方俊
2023-03-14

“常规”内部类有一个指向外部类实例的隐藏(隐式)指针。这允许编译器生成代码来为您追踪指针,而无需您键入它。例如,如果外部类中有一个变量“a”,那么内部类中的代码只能执行“a=0”,但编译器将为“outerPointer.a=0”生成代码,将隐藏的指针保持在幕后。

这意味着当你创建一个内部类的实例时,你必须有一个外部类的实例来链接它。如果在外部类的方法中创建,那么编译器知道使用“this”作为隐式指针。如果您想链接到其他外部实例,那么可以使用特殊的“new”语法(请参阅下面的代码片段)。

如果将内部类设置为“静态”,那么就没有隐藏指针,内部类不能引用外部类的成员。静态内部类与常规类相同,但其名称的作用域在父类内部。

下面是一段代码,演示了创建静态和非静态内部类的语法:

public class MyClass {

    int a,b,c; // Some members for MyClass

    static class InnerOne {
        int s,e,p;
        void clearA() {
            //a = 0;  Can't do this ... no outer pointer
        }
    }

    class InnerTwo {
        //MyClass parentPointer;      Hidden pointer to outer instance
        void clearA() {         
            a = 0;
            //outerPointer.a = 0      The compiler generates this code
        }       
    }

    void myClassMember() {
        // The compiler knows that "this" is the outer reference to give
        // to the new "two" instance.
        InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
    }

    public static void main(String args[]) {

        MyClass outer = new MyClass();

        InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
        InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
        InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope

    }

}
闻人昕
2023-03-14

你还必须有一个对其他外部类的引用。

Inner inner = new MyClass().new Inner();

如果内部是静态的,那么它将是静态的

Inner inner = new MyClass.Inner();
 类似资料:
  • 问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么呢 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 我无法编译以下代码: 出现以下错误: 无法从静态内容引用非静态方法calcArea(int,int) 这是什么意思?我该如何解决该问题..? 编辑: 根据您的建议,我创建了一个新的test()实例,如下所示: 这样对吗?如果我这样做有什么区别… 问题答案: Nanne提出的建议绝对可以解决您的问题。但是,我认为如果现在就养成习惯,在学习Java的早期阶段,尝试尽可能少地使用静态方法(例

  • PowerMockito.when(ConnectionFactory.getConn(“ABC”).getCurrentStatus()).thenReturn(ConnectionStatus.Connected); 对于上面的陈述,我得到了一个NPE。 我在junit测试类的开头已经有@PrepareForTest({fxallConnectionFactory.class,Connecti

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则它可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。