0

这是我的第一堂课:

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不公开的错误,无法从外部包访问。

4

1 回答 1

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 私有的构造函数,因为该类是包私有的。然后它禁用对它的保护,注意这些是临时的,构造函数对象是一个新的引用,只允许通过这个引用进行调用。

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

于 2019-06-20T21:46:37.913 回答