[英]Initialize a class having another class object as member variable
这是我的第一堂课:
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这样的框架中的程序员,但否则会破坏面向对象的模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.