这是我的第一堂课:
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
不是公开的,无法从外部程序包访问。
答案 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这样的框架中的程序员,但否则会破坏面向对象的模式。