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:)