初始化一个具有另一个类对象作为成员变量的类

时间:2019-06-20 19:59:53

标签: java

这是我的第一堂课:

package trickycorejava;

public class InnerClass {
    int id;
    oneClass oneClass;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public trickycorejava.oneClass getOneClass() {
        return oneClass;
    }

    public void setOneClass(trickycorejava.oneClass oneClass) {
        this.oneClass = oneClass;
    }

    public InnerClass(int id, trickycorejava.oneClass oneClass) {
        this.id = id;
        this.oneClass = oneClass;
    }
    public InnerClass(int id){
        this.id = id;
    }
}

class oneClass {
    private String name;

     public String getName() {
        return name;
     }

     public void setName(String name) {
        this.name = name;
    }
}

这是main方法所在的类,请注意程序包是不同的:

package trickycorejava.constructor;

import trickycorejava.InnerClass;

public class InnerClassTest {
    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass(1);
    }

}

在这种情况下,如何使用构造函数初始化InnerClass?如果我使用

InnerClass innerClass = new InnerClass(1, new oneClass("Test"));

我收到一个错误消息:oneClass不是公开的,无法从外部程序包访问。

1 个答案:

答案 0 :(得分:2)

正如Turing85指出的,oneClass应该在它自己的文件中,否则它将是package-private,这意味着您只能从相同包的类中访问它。

还有另一种方法吗?有,但不会是简单的构造函数调用。使用反射,您可以绕过类,字段和方法的调用保护。

public class InnerClassTest {
    public static void main(String[] args) throws Exception {
        Constructor<OneClass> constructor = OneClass.class.getDeclaredConstructor(String.class);
        constructor.setAccessible(true);
        OneClass instance = constructor.newInstance("John");
        InnerClass innerClass = new InnerClass(1, instance);
    }
}

这样做是因为它找到了Main私有的构造函数,因为该类是程序包私有的。然后,它将禁用它的保护,请注意,这些是临时的,Constructor对象是一个新引用,并且仅允许通过此引用进行调用。

但是,我不建议您这样做。反射有一些用例,主要用于帮助像Spring这样的框架中的程序员,但否则会破坏面向对象的模式。