【问题标题】:Accessing objects in other classes访问其他类中的对象
【发布时间】:2014-05-25 16:50:27
【问题描述】:

我在一本 Java 书籍中读到,为了访问一个类中的方法等,需要使用构造函数创建一个对象。下面是一个例子……

Class1
Class2 MyObject = new Class2();
MyObject.methodCall();

Class2
methodCall(){

}

现在我正在制作一个 android 应用程序,我使用了上述方法,但出现了错误,然后我阅读了 blog,它提供了一种从其他类访问方法等的替代方法。

Class1
Class2 myObject;
myObject.myMethod();

Class2
myMethod(){

}

没有上述方法如何工作

new *InsertClassName*();

编辑

public class ButtonClickListener implements OnClickListener{
     VerificationMethods VM;
     VM.authenticateForFunctionsandNumbers();
}


public class VerificationMethods {
    ButtonClickListener BCL;
    public boolean authenticateForFunctionsandNumbers(){
         return trueOrFalse;
    }
}

Logcat:

05-25 17:19:02.195: E/AndroidRuntime(718): FATAL EXCEPTION: main
05-25 17:19:02.195: E/AndroidRuntime(718): java.lang.StackOverflowError
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonClickListener.java:41)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.VerificationMethods.<init>(VerificationMethods.java:5)
05-25 17:19:02.195: E/AndroidRuntime(718):  at com.example.myfirstcalculator.ButtonClickListener.<init>(ButtonCli
05-25 17:19:02.265: W/ActivityManager(61):   Force finishing activity com.example.myfirstcalculator/.MainActivity

代码:

ButtonClickListener.java

public class ButtonClickListener implements OnClickListener{
    EditText outputBoxID;
    String buttonID;
    Context context;
    static String valueofOutput;
    static double NumBeforeFunct;
    static double NumAfterFunct;
    static String rtAnswer;
    static char[] realTimeStringArray;
    static char[] valueofOutputArray;
    static StringBuilder valueofOutputBuild = new StringBuilder();
    static String NBFAS;
    static String NAFAS;
    static StringBuilder realTimeStringBuild = new StringBuilder();

    static String realTimeString;
    VerificationMethods VM = new VerificationMethods();
    //error occuring between here

    public ButtonClickListener(EditText outputBoxID, String buttonID, Context context){

        this.outputBoxID = outputBoxID;
        this.buttonID = buttonID;
        this.context = context; 

    }

    @Override
    public void onClick(View v) {

        valueofOutput = outputBoxID.getText().toString();

    ...

VerificationMethods.java

public class VerificationMethods {
    ButtonClickListener BCL = new ButtonClickListener(null, null, null);
    //error - ...and here

    public boolean authenticateForFunctionsandNumbers(){
        if(ButtonClickListener.valueofOutput.isEmpty()){
            return true;
        }else{
            return false;
        }

    ...

【问题讨论】:

  • 请添加可编译代码。我无法相信您发布的内容,因为在某些上下文之外它没有任何意义。
  • 代码很多...我看看我能做什么
  • 我们不想看到所有代码。我们想看看相关代码。
  • 我无法添加任何实际代码,从您不想看到的位中提取您想要看到的位有点困难。
  • 忘记你的实际代码。你问的是一个概念。发布可编译的代码,展示您在方法调用和类实例化方面的问题。

标签: java android class object constructor


【解决方案1】:

首先,快速解释一下new 关键字。

类就像创建对象的蓝图。所以在这段代码中:

public class Cat {

    // This is a constructor
    public Cat() {

    }

    public void purr() {
        System.out.println("prrrrrrrr");
    }

}

这个类叫做猫。每次我们写new Cat() 时,我们都在创建一个 Cat 类的新对象(实例)。每次我们创建一个新的猫对象时都会调用构造函数。

假设我们想让猫发出咕噜声。为此,我们首先需要创建一个猫对象(否则,什么是咕噜声?),所以我们可以写new Cat().purr();

这会为我们创造一只新猫,然后告诉那只猫发出咕噜声。

假设有一种方法实际上不需要猫来工作,例如:

public static void buyCatCollar() {

}

我们可以在没有猫的情况下购买猫项圈。我们不需要一只真正的猫来做到这一点。

我们在这里添加static关键字,表示该方法属于,而不是对象。这意味着我们可以编写Cat.buyCatCollar(),而无需使用 cat 对象。这意味着我们不需要写new Cat(),因为我们实际上并不需要一只猫来购买项圈。

现在继续你的例子。

当你写作时:

public class ButtonClickListener implements OnClickListener{
    VerificationMethods VM;
    VM.authenticateForFunctionsandNumbers();
}

这意味着 VM 是 VerifcationMethods 类的一个实例。当您编写VM.authenticateForFunctionsandNumbers(); 时,您将收到一个空指针异常,因为您从未真正将 VM 设置为新实例。您需要将其更改为:

public class ButtonClickListener implements OnClickListener{
    VerificationMethods VM = new VerificationMethods();
    VM.authenticateForFunctionsandNumbers();
}

或者,假设您不需要新实例,您可以将authenticateForFunctionsandNumbers() 方法设为静态,然后编写:

public class ButtonClickListener implements OnClickListener{
    VerificationMethods.authenticateForFunctionsandNumbers();
}

但是,除非您将 static 关键字添加到您的方法中,否则这将不起作用。

【讨论】:

  • 一开始我已经按照你说的做了,这就是给我的错误,我会把日志猫贴上去,它似乎在创建的两个对象之间交替
  • 在一个类中它是 [VerificationMethods VM = new VerificationMethods();] - 第 41 行,在另一个类中 [ButtonClickListener BCL = new ButtonClickListener(null, null, null);] - 第 5 行跨度>
  • @user3470343 同样,您还没有发布实际导致错误的代码,但是,基本上,您的 VerificationMethods 似乎创建了一个 ButtonClickListener,它创建了一个 VerificationMethods,它创建了一个....
  • 你有一个 stackoverflow 异常,这意味着你可能正在进行一些无限递归
【解决方案2】:

您必须创建一个类(类型),它是该类型稍后实例化对象的定义。

例如

public class MyClass {
    /**
     * Constructor method
     */
    public MyClass() {
        // some code
    }

    /**
     * Some method, that does something.
     */
    public void someMethod() {
        // do something here
    }
}

然后,您可以在代码中的其他位置调用该类型的构造函数来获取该类型的实例。例如

MyClass instance = new MyClass();

如果你给指定的类增加更多的方法,那么你可以在实例化的对象上调用这些方法:

instance.someMethod();

【讨论】:

    【解决方案3】:

    我的猜测是在第二个示例中您使用静态方法,它不需要使用 new 运算符创建新的对象实例。

    这将可用于任何地方,您无需使用 new 创建对象:

    public class MyClass1 {
        public static void myMethod1(){
            //something something
        }
    }
    

    这需要创建新对象:

    public class MyClass2 {
        public void myMethod2(){
             //something something again
        }
    }
    

    现在你可以使用了:

    MyClass1 myObject1;
    myObject1.myMethod1();
    

    但是:

    MyClass2 myObject2 = new MyClass();
    myObject1.myMethod2();
    

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      相关资源
      最近更新 更多