如何返回java私有内部类对象的对象

如何返回java私有内部类对象的对象,java,inner-classes,Java,Inner Classes,如何返回私有内部类的对象 public class MainClass{ public InnerClass getObj(){ return this.new InnerClass() } private class InnerClass{ InnerClass(){ } } } ------------- MainClass mc = new MainClass(); mc.getObj(); // assume I am n

如何返回私有内部类的对象

public class MainClass{
   public InnerClass getObj(){
       return this.new InnerClass()
   }
   private class InnerClass{
       InnerClass(){
       }
   }
}
-------------
MainClass mc = new MainClass();
mc.getObj(); // assume I am not holding it anywhere.
当我使用try-catch块进行检查时,上面的代码给出了一个空指针异常。 另外,当在调试模式下尝试时,它会显示“ClassNotFoundException”


但是我可以看到生成为MainClass$InnerClass.class的类文件,您只是忘记了getObj方法的返回类型

 public InnerClass getObj(){return new InnerClass();}

您只是忘记了getObj方法的返回类型

 public InnerClass getObj(){return new InnerClass();}

嗯,我没有同样的问题。以下是我对您的代码的修改版本:

class MainClass {
    public static void main( String[] args ) {
        MainClass mc = new MainClass();
        InnerClass ic = mc.getObj();
        System.out.println( ic );
    }

    public InnerClass getObj() {
        return this.new InnerClass();
    }

    private class InnerClass {
        InnerClass() {}
    }
}
该代码的结果是:

MainClass$InnerClass@64c3c749

嗯,我没有同样的问题。以下是我对您的代码的修改版本:

class MainClass {
    public static void main( String[] args ) {
        MainClass mc = new MainClass();
        InnerClass ic = mc.getObj();
        System.out.println( ic );
    }

    public InnerClass getObj() {
        return this.new InnerClass();
    }

    private class InnerClass {
        InnerClass() {}
    }
}
该代码的结果是:

MainClass$InnerClass@64c3c749

正如其他人已经指出的,您所需要做的就是修复方法的返回类型


但是,您应该注意,由于您在公共方法中导出非公共类型,因此会收到一条警告。

正如其他人已经指出的那样,您需要做的只是修复方法的返回类型

但是,您应该注意,由于在公共方法中导出非公共类型,因此会收到警告。

由于getObj是公共的,您应该根据需要将内部类保持私有并返回对象,或者将其公开并返回内部类

以下代码在示例中返回一个对象:

public class MainClass {
        private class InnerClass {
                InnerClass() { System.out.println("InnerClass"); }
        }

        public Object getObj(){
                return new InnerClass();
        }

        public static void main (String[] argc) {
                MainClass a = new MainClass();
                System.out.println(a.getObj());
        }
}
它打印出:

bash-4.2$ java MainClass
InnerClass
MainClass$InnerClass@53c059f6
正如您所看到的,构造函数没有问题。

因为您的getObj是公共的,所以您应该将内部类保持私有并返回一个对象,或者将其公开并返回一个内部类,这取决于您的需要

以下代码在示例中返回一个对象:

public class MainClass {
        private class InnerClass {
                InnerClass() { System.out.println("InnerClass"); }
        }

        public Object getObj(){
                return new InnerClass();
        }

        public static void main (String[] argc) {
                MainClass a = new MainClass();
                System.out.println(a.getObj());
        }
}
它打印出:

bash-4.2$ java MainClass
InnerClass
MainClass$InnerClass@53c059f6

正如您所看到的,构造函数没有问题。

我可以看到没有调用InnerClass的构造函数。我尝试将访问修饰符更改为public/none,其行为仍然相同,getObj的返回类型设置为void,因此您将无法返回任何内容。正确的返回类型应该是什么?感谢您的指点,我编辑了代码,它的InnerClass为我们编写了一个并发布了它。实际上,代码中有一些错误,我认为这是一些与InnerClass相关的访问,但是在做了适当的调试之后,问题是其他的。如果我提供实际的代码,它会更容易,但是。。现在很清楚了..我可以看到InnerClass的构造函数没有被调用。我尝试将访问修饰符更改为public/none,其行为仍然相同,getObj的返回类型设置为void,因此您将无法返回任何内容。正确的返回类型应该是什么?感谢您的指点,我编辑了代码,它的InnerClass为我们编写了一个并发布了它。实际上,代码中有一些错误,我认为这是一些与InnerClass相关的访问,但是在做了适当的调试之后,问题是其他的。如果我提供实际的代码,它会更容易,但是。。现在很清楚了。我不知道为什么它在我的projectlittle diff代码中不起作用,但是当我复制并运行你的代码时,它工作得很好。。如果没有的话,我会在复习完后试着对问题进行适当的修改。。将标记您的正确。在这种情况下,main可以看到私有类型,因为它在同一个类中。如果main在另一个类中,它将不工作我不确定为什么它在我的项目中不工作Little diff代码,但是当我复制并运行您的代码时,它工作正常。。如果没有的话,我会在复习完后试着对问题进行适当的修改。。将标记您的正确。在这种情况下,main可以看到私有类型,因为它在同一个类中。如果main在另一个类中,它将不起作用编辑它,但返回新的InnerClass将不起作用,必须使用this.new InnerClass。编辑它,但返回新的InnerClass将不起作用,必须使用this.new InnerClass。他抱怨出现NullPointerException,这不能作为标记“void”包含“return”的方法的结果。这是因为“void”/“return”冲突是编译时错误,而NullPointerException是运行时异常。如果他发布的代码不能通过编译时间,他怎么可能得到运行时异常?直观的答案是:他发布了错误的代码,“void”/“return”问题在他的实际代码库中并不存在,他的问题仍然存在完全正确!然而,随着大量答案的到来,我至少想让大家注意到,所提供的示例代码在公共API中公开了非公共类型。如果发布了错误的代码,我们真的无法调试和帮助+对于这一点为1,对于SSCCE为+1,他抱怨NullPointerException,这不能因为标记包含“return”的方法为“void”而产生。这是因为“void”/“return”冲突是编译时错误,而NullPointerException是运行时异常。如果他发布的代码不能通过编译时间,他怎么可能得到运行时异常?直观的答案是:他发布了错误的代码,即“void”/“return”pro
这个问题在他的实际代码库中并不存在,他的问题仍然存在完全正确!然而,随着大量答案的到来,我至少想让大家注意到,所提供的示例代码在公共API中公开了非公共类型。如果发布了错误的代码,我们真的无法调试和帮助+此为1,SSCCE为+1