gpt4 book ai didi

java - 初始化一个类,将另一个类对象作为成员变量

转载 作者:行者123 更新时间:2023-12-02 01:27:24 25 4
gpt4 key购买 nike

这是我的第一个类:

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 = new InnerClass(1, new oneClass("测试"));

我收到错误:oneClass 不是公共(public)的,无法从外部包访问。

最佳答案

正如 Turing85 指出的那样,oneClass 应该位于它自己的文件中,否则它将是包私有(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 私有(private)的构造函数,因为该类是包私有(private)的。然后它禁用它的保护,注意这些都是临时的,Constructor对象是一个新的引用,只允许通过这个引用进行调用。

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

关于java - 初始化一个类,将另一个类对象作为成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56693084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com