【问题标题】:Is there any way to create object of method-local inner class in main method?有没有办法在主方法中创建方法局部内部类的对象?
【发布时间】:2021-03-17 05:48:07
【问题描述】:

我想知道是否有任何方法可以借助 Outerclass 对象在 main() 方法中创建方法本地内部类对象。

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;

      // method-local inner class
      class MethodInner_Demo {
         public void print() {
            System.out.println("This is method inner class "+num);     
         }   
      } // end of inner class
       
      // Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      outer.my_Method();           
   }
}

编辑-1: 我正在探索在 main 方法中实例化方法本地内部类的方法(我知道方法本地内部类对 main 方法不可见)但是,有什么解决方法吗?

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;

      // method-local inner class
      class MethodInner_Demo {
         public void print() {
            System.out.println("This is method inner class "+num);     
         }   
      } // end of inner class   
   }
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      //inner-class object is created while calling my_Method()
      // TBH IDK how to do this 
      outer.my_Method().new MethodInner_Demo();
       
   }
}

【问题讨论】:

  • 如果要从其他函数中访问,为什么要在函数中声明该类?
  • @akuzminykh 可能是这样它可以访问局部变量num。这当然会导致一个问题,如果该类是从另一个方法实例化的,将使用哪个num
  • 感谢您的努力,请参阅edit1。
  • @akuzminykh,为了回答你的问题,我正在探索方法本地内部类的灵活性以重用预先编写的类的可能性。

标签: java static inner-classes


【解决方案1】:

Class MethodInner_Demolocal 类,而不是 inner 类,因为它是在方法体中声明的。参见例如The Java™ Tutorials.

本地类只能被声明它的方法中的代码看到。

如果你希望能够从另一个方法创建类的实例,那么你需要将类移到方法之外,这样它就变成了一个真正的inner类。

然后,您可以创建一个实例,假设您已“授权”,如 publicprotectedprivate 访问修饰符所定义的那样。您可以通过使用外部类的实例限定 new 运算符来做到这一点。

在你的情况下,我们还需要添加一个字段来携带num的值。

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;
       
      // Accessing the inner class
      Inner_Demo inner = new Inner_Demo(num);
      inner.print();
   }

   // inner class
   class Inner_Demo {
      private final int num;
      Inner_Demo(int num) {
         this.num = num;
      }
      public void print() {
         System.out.println("This is inner class "+num);
      }   
   } // end of inner class
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      outer.my_Method();
      
      // Accessing the inner class
      int num = 42;
      Inner_Demo inner = outer.new Inner_Demo(num);
      inner.print();
   }
}

【讨论】:

  • 谢谢,@Andreas,感谢您的努力,但我正在寻找一种方法来实例化方法 - 在 main 方法中的本地内部类。 (这实际上是不可能的,因为方法本地内部类对主方法不可见)。
【解决方案2】:

方法本地类的类型对main 是不可见的。但是,您可以创建该实例并将其传递给 main

public class OuterClass {
    Object createInnerClass() {
        int num = 23;
        class InnerClass {
            @Override
            public String toString() {
                return "I'm InnerClass. num=" + num;
            }
        }
        return new InnerClass();
    }

    public static void main(String args[]) {
        OuterClass outer = new OuterClass();
        Object obj = outer.createInnerClass();
        System.out.println(obj);
    }
}

输出:

I'm InnerClass. num=23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多