繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM