Java 我可以调用另一个类的对象吗?
我有两门课,如下所示:Java 我可以调用另一个类的对象吗?,java,Java,我有两门课,如下所示: public class JavaApplication12 { public static void main(String[] args) { NewClass aclass = new NewClass("rabbit", "bungalow"); System.out.println(aclass.toString()); }} 及 所以我在JavaApplication12中有一个名为aclass的对象,我已经能够打印出这个对象的toString
public class JavaApplication12 {
public static void main(String[] args) {
NewClass aclass = new NewClass("rabbit", "bungalow");
System.out.println(aclass.toString());
}}
及
所以我在JavaApplication12中有一个名为aclass的对象,我已经能够打印出这个对象的toString。我还希望能够打印出NewClass中对象class1和class2的toString,但我希望在JavaApplication12中打印它们,因为这是我可以运行的主类。如果我只是写
System.out.println(class1.toString());
在JavaApplication12中,它显然不知道该做什么,因为它看不到JavaApplication12中的对象class1。有没有办法在JavaApplication12中打印出class1的toString
编辑
所以我想我已经发现我不能以我的方式存储猫、狗等信息-我想也许这就是我如何设法让一些人感到困惑的原因,对此感到非常抱歉!
有没有一种方法可以将这样的信息存储在第二个类中,并将其调用到主类中,例如,我希望能够在JavaApplication1中打印
cat,dog
,但可以将此信息存储在NewClass中,还可以存储许多其他此类信息。那会是ArrayList吗?再次抱歉造成混淆。在class1
和class2
字段之前添加public
修饰符,或提供一个。然后在你的主课堂上这样做:
System.out.println(aclass.class1.toString());
System.out.println(aclass.class2.toString());
或者,如果您提供了getter方法:
System.out.println(aclass.getClass1().toString());
System.out.println(aclass.getClass2().toString());
如果我理解正确,您创建了
class1
和class2
作为NewClass
的属性,然后必须转到main方法。然后像使用aclass
一样打印它,如下所示:
public class JavaApplication12 {
public static void main(String[] args) {
NewClass aclass = new NewClass("rabbit", "bungalow");
System.out.println(aclass.toString());
NewClass class1 = new NewClass("cat", "house");
System.out.println(class1.toString());
NewClass class2 = new NewClass("dog", "shed");
System.out.println(class2.toString());
}
}
public class NewClass {
String animal;
String building;
public NewClass(String A, String B){
animal=A;
building=B;}
// move these two lines to main
//NewClass class1 = new NewClass("cat", "house");
//NewClass class2 = new NewClass("dog", "shed");
@Override
public String toString(){
return animal+building;
}
}
在本例中,实例化
NewClass
类型的对象总是会导致stackoverflow错误。为什么?因为您已将class1
和class2
定义为实例字段,这些字段将立即分配。它们依次是NewClass
的实例
这意味着如果你这样做:
NewClass aclass = new NewClass("rabbit", "bungalow");
它还尝试创建以下两个字段:
NewClass class1 = new NewClass("cat", "house");
NewClass class2 = new NewClass("dog", "shed");
这反过来也会起到同样的作用。这是创建新对象的无休止的递归
我建议您首先阅读什么是类和实例、构造函数如何工作、字段访问和可见性以及实例字段和静态字段之间的区别。按照一些Java教程掌握面向对象的概念。我不确定你的问题,但我会尝试回答: 您有静态变量和“正常”变量。 当您创建一个类的对象时,您也为它创建了每个普通变量。例如:
class Foo {
public int a; //For each obj
public static int b=3; //Global var of the class, acessable from anywhere
public Foo(int a) {
this.a=a;
}
}
System.out.println(new Foo(0).a); //-> 0
public Foo f;
当然,类中有静态变量,而不是每个对象
System.out.println(Foo.b); //-> 3
因此,您的类中也可以有相同类类型的OBJ,例如:
class Foo {
public int a; //For each obj
public static int b=3; //Global var of the class, acessable from anywhere
public Foo(int a) {
this.a=a;
}
}
System.out.println(new Foo(0).a); //-> 0
public Foo f;
解决方案1:正如其他人所建议的,您可以将它们移动到您的主要方法:
public class JavaApplication12 {
public static void main(String[] args) {
NewClass aclass = new NewClass("rabbit", "bungalow");
NewClass class1 = new NewClass("cat", "house");
NewClass class2 = new NewClass("dog", "shed");
System.out.println(aclass.toString());
}}
public class NewClass {
String animal;
String building;
public static NewClass class1 = new NewClass("cat", "house");
public static NewClass class2 = new NewClass("dog", "shed");
public NewClass(String A, String B){
animal=A;
building=B;}
@Override
public String toString(){
return animal+building;
}}
及
主要访问:
System.out.println(class1.toString());
解决方案2:将它们设置为静态,以便您可以从主方法访问它们
public class JavaApplication12 {
public static void main(String[] args) {
NewClass aclass = new NewClass("rabbit", "bungalow");
NewClass class1 = new NewClass("cat", "house");
NewClass class2 = new NewClass("dog", "shed");
System.out.println(aclass.toString());
}}
public class NewClass {
String animal;
String building;
public static NewClass class1 = new NewClass("cat", "house");
public static NewClass class2 = new NewClass("dog", "shed");
public NewClass(String A, String B){
animal=A;
building=B;}
@Override
public String toString(){
return animal+building;
}}
然后在主界面中访问它们:
System.out.println(NewClass.class1.toString());
请注意,这样您就不会有无限递归G_H指出
解决方案3:为每个obj配备它们(仅当您需要时)
注意:您必须从obj访问它们,例如aclass:
System.out.println(aclass.class1.toString());
该解决方案还提供了更大的灵活性,因为您可以为不同的OBJ设置不同的值,例如,如果每只动物都有两个邻居我不理解您的问题,即使在读了两遍之后。感谢您的回答,这样一个难以理解的问题将
class1
和class2
公开,或者添加从其他地方访问这些内容的getter。@Isawahatone:请回答这个问题,它不是javascript,它唯一的java:)