有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中,是否可以在单个语句中实例化一个类并将其分配给一个成员变量?

我希望在Java中执行类似的操作:

public OuterClass {

    public innerClass = new Object() {
        private var1;

        public void myMethod() {
           ...
        }
    }

}

然后像这样使用它:

OuterClass outer = new OuterClass();
outer.innerClass.myMethod();

原因是基本上在OuterClass中命名一些方法,以保持事情的有序性

我知道我可以创建innerClass的实例,并将其分配给OuterClass的公共实例变量,但我正在寻找一种内联方式,如上面的示例所示。我不希望可以多次实例化innerClass,因此使用内联方法

这将类似于以下JavaScript:

var innerObject = new function() {
   ...       
}

共 (2) 个答案

  1. # 1 楼答案

    您是否尝试过:

    public class OuterClass {
    
        public static void main(String[] args) {
            OuterClass o = new OuterClass();
            o.new InnerClass().method();
        }
    
        class InnerClass {
    
            public void method() {
                //do something
            }
        }
    }
    

    这使用了您建议的语法,但没有满足您不需要多个InnerClass实例的要求

  2. # 2 楼答案

    你在问题标题中所问的是可能的,但不幸的是不是你真正想要的

    在代码中,带有字段innerClass声明的行缺少字段的类型。在代码的其余部分不变的情况下,只有一种可能性:Object

    因此,您的代码如下所示:

    public OuterClass {
    
        public Object innerClass = new Object() {
            private var1;
    
            public void myMethod() {
               ...
            }
        }
    }
    

    这实际上是可能的,但是调用方法myMethod是不可能的。当您访问outer.innerClass时,此表达式的类型为Object,它没有方法myMethod,因此代码不会编译

    但是,您可以引入一个接口MyInnerInterface

    interface MyInnerInterface {
        void myMethod();
    }
    

    并将字段的类型更改为MyInnerInterface

    public OuterClass {
    
        public MyInnerInterface innerClass = new MyInnerInterface() {
            private var1;
    
            public void myMethod() {
               ...
            }
        }
    }
    

    然后访问该方法是可能的。但是,您有附加接口的缺点

    这个代码是不寻常的,我不认为它是好的。如果您真的想在这里拥有一个内部类,请不要使用匿名类,而是使用真实的类:

    public OuterClass {
    
        public class InnerClass  {
            private var1;
    
            public void myMethod() {
               ...
            }
        }
    
        public InnerClass innerClass = new InnerClass();
    }
    

    不过,使用内部类从外部进行“范围”访问是我不会做的事情。内部类通常应该是外部类的一个实现细节,不可供公众访问。最好考虑如何将API分离到真正的共存类中(当然,这些类可能相互引用,并且可能访问包私有成员)