这是我的第一堂课:
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
不是从外部程序包无法访问的非公共错误。
正如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这样的框架中的程序员,但否则会破坏面向对象的模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句