-1

在我的 B 类中,我希望能够使用我的 A 类中的方法。这是我尝试过的。

  1. 进口A类
  2. 初始化它 - classA a = new classA(null, null);
  3. 添加到我想使用 A 类方法的方法中

    public void getAMethod() { a.getTestValue; }

我的问题是:

  1. 这是正确的方法吗?
  2. 每次执行 B 类时,是否总是创建 A 类的新实例?
  3. 如果打开了 A 类并且我运行 B 类,那么 B 类是获取 A 类中变量的当前值,还是因为 new classA(null, null) 而获取了 A 类的默认值?

我的问题是:

  1. 对于同一个变量,我得到了 2 个不同的值。

示例:A 类 -

initialize = boolean test = false

当 A 类对话框打开时,设置 test = true

创建方法

public boolean getTestValue() {
   return test;
}

从 A 类中运行 getTestValue 时,它​​始终为真 从 B 类调用 getTestValue 时,它​​始终返回 false(即使 A 类对话框打开)

好像b类每次都在做A类的新实例,所以它只看到A类的默认值。当B类调用A类时,我需要获取A类的当前值,而不是默认值

编辑 我将 A 类中的方法更改为静态,它解决了我遇到的问题。这对我帮助很大——感谢大家的建议!

4

3 回答 3

2

好的,有相当多的基础要涵盖,但我会尽量简短并依次回答每个问题。

1. 这是正确的做法吗?

通常不需要在小程序中导入类。如果ClassAClassB位于同一个中,或者它们都没有分配包,但位于同一目录中,则不需要导入。

至于在方法中包装ClassA方法ClassB,不,。您可以随时从内部访问ClassA 静态方法ClassB

ClassA.myMethodInClassA();

如果myMethodInClassA();不是静态的,那么你需要在一个这样的实例上调用它ClassA,(仍然在 ClassB 中)你会这样做;

ClassA myA = new ClassA();
myA.myMethodInClassA();

这让我想到了staticvsnon static领域。如果您的字段initializetest标记为static,例如;

public static boolean initialize = false;

然后它们将在所有实例中始终具有相同的值,并且可以从任何地方访问;ClassA

if(ClassA.initialize) {
    //something
}

如果它们没有被标记为静态,那么(很像非静态方法)你需要一个实例ClassA查询字段,例如;

ClassA myA = new ClassA();
if(myA.initialize) {
    //something
}

在这种情况下, 的每个实例都有ClassA自己的 副本initialize,因此 的值initialize取决于您要查询的实例。

2.是不是每次执行B类,总是创建一个A类的新实例?

如果你在构造函数中调用构造ClassA函数 forClassB那么答案是肯定的,换句话说,如果你这样做了;

public ClassB() {
    //constructor for ClassB
    ClassA c = new ClassA();
}

那么是的,ClassA 每次创建新的ClassB.

3.如果A类打开,我运行B类,B类是获取A类中变量的当前值,还是因为new classA(null, null)得到A类默认值?

如果“打开”是指您在命令提示符下运行java ClassA然后运行java ClassB,那么您所拥有的是两个独立的程序,两个并行运行的 JVM 实例。这两个程序彼此没有任何关系,除非您专门实现某些东西,否则它们无法以任何方式相互通信。

如果“打开”是指构造,new ClassA();那么我们再次谈论类与实例成员。

在我对问题 1 的回答中,我对staticvsnon-static领域和方法进行了咆哮,该问题涵盖了这一点。总的来说,我建议您阅读一些文档,例如:

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

TLDR:去阅读这个链接^^

于 2012-10-17T16:40:31.670 回答
1

@Jkteater因为你不支持你的代码片段的问题,但根据你的问题

Is this the correct way to do it ?

Ans:您可以通过两种方法在任何其他类中使用 A 类的方法,一种是我在 B 类中创建 A 类的对象(classA a=new classA(); A.getTestValue();),第二种是通过继承将 A 类扩展为 B 类(B 类扩展 A 类)。

Is every time I execute class B, is it always creating a new instance of class A?

Ans:如果您不想创建 A 类的新实例,那么要么在 B 类中扩展 A 类,要么在 A 类中使您的方法静态。在静态情况下,您将仅通过类名使用它(A.getTestValue();)

If class A is opened and I run class B, does class B get the current
  values of variables in class A, or does it get the class A defaults
   because of new classA(null, null)

Ans:classA a=new classA(null,null);this class(null,null)是一个构造函数,用于初始化A类的非静态数据成员不会有任何区别B类的当前值是多少,该值您将通过此构造函数,这将初始化 A 类的非静态数据成员。

对于您的以下问题,您可以粘贴确切的代码,以便我能够给出确切的答案..

于 2012-10-17T16:54:46.677 回答
0

将变量 test 设为静态,因为您正在创建 A 的新实例,所以值不同

这是正确的方法吗?
好吧,这取决于详细的用例

是每次我执行 B 类时,它总是创建 A 类的新实例吗?
是的,每次创建 B 的实例时,它都会创建一个新的 A

实例因为新的classA(null,null)?
由于您正在创建一个新实例,因此您将获得默认值

于 2012-10-17T16:33:17.770 回答