【问题标题】:Android Studio Java - Which modifier should I use?Android Studio Java - 我应该使用哪个修饰符?
【发布时间】:2016-05-17 11:36:42
【问题描述】:

我对 Android Studio 和 Java 有点陌生,所以请多多包涵。

我正在制作一个应用程序,您可以在其中通过飞镖游戏记录分数。我有一个 switch 语句,用于单击哪个按钮。当按下回车按钮时,我希望它在使用一个参数(即输入)时转到另一个 Java 文件。显然我同时使用静态和非静态方法,这是错误的。我该如何解决这个问题?

这是我的第一个 java 文件,来自屏幕的文件:

package com.example.jeroe.darts;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; 
import android.view.View;
import android.widget.TextView;
import com.example.jeroe.darts.Score;


public class MatchScreen extends AppCompatActivity implements View.OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_match_screen);

    DefineEventHandlers();
}

public void onClick(View v) {
    TextView InputTrue = (TextView) findViewById(R.id.TextviewInput);
    TextView editTextScore = (TextView) findViewById(R.id.editTextScore);
    switch (v.getId()) {
        case R.id.TextViewInnerbull:
            editTextScore.append("50");
            break;
        case R.id.TextViewOuterBull:
            editTextScore.append("25");
            break;
        case R.id.TextViewClear:
            editTextScore.setText("");
            break;
        case R.id.TextViewEnter:

            Score.enter(editTextScore.getText());
            // here i get an error:
            //non-static method 'enter(charsequence)' cannot be referenced from a static context

    }
}

public void DefineEventHandlers()
{
    // declare textviews Player 1
    TextView TextViewPL1Score = (TextView) findViewById(R.id.TextViewPL1Score);
    TextView PL1Dart1 = (TextView) findViewById(R.id.PL1Dart1);
    TextView PL1Dart2 = (TextView) findViewById(R.id.PL1Dart2);
    TextView PL1Dart3 = (TextView) findViewById(R.id.PL1Dart3);

    // declare textviews Player 2
    TextView TextViewPL2Score = (TextView) findViewById(R.id.TextViewPL2Score);
    TextView PL2Dart1 = (TextView) findViewById(R.id.PL2Dart1);
    TextView PL2Dart2 = (TextView) findViewById(R.id.PL2Dart2);
    TextView PL2Dart3 = (TextView) findViewById(R.id.PL2Dart3);

    //T20, bulls
    TextView TextViewOuterBull = (TextView) findViewById(R.id.TextViewOuterBull);
    TextViewOuterBull.setOnClickListener(this);
    TextView TextViewInnerBull = (TextView) findViewById(R.id.TextViewInnerbull);
    TextViewInnerBull.setOnClickListener(this);

    //Enter, backspace
    TextView TextViewClear = (TextView) findViewById(R.id.TextViewClear);
    TextViewClear.setOnClickListener(this);
    TextView TextViewEnter = (TextView) findViewById(R.id.TextViewEnter);
    TextViewEnter.setOnClickListener(this);
}

} //end of the file

然后我需要它转到另一个名为 score.java 的文件。这里我希望它保留分数和其他一些东西:

package com.example.jeroe.darts;

public class Score {
int PL1Score = 501;
boolean player1 = true;

public void enter(CharSequence input) {

    int IntInput = InputConverter(input);

    if (player1 == true) //de input is = player 1
    {
        // do something
    }
}



public int InputConverter(CharSequence input) {
    int Input = Integer.parseInt(input.toString());
    return Input;
}

}

我该如何解决这个问题?

【问题讨论】:

  • @Gavriel - 找到它,搜索 - Score.enter(editTextScore.getText());
  • 我建议为每个按钮创建单独的onClick() 方法,而不是一个带有巨大switch 语句的onClick() 方法。当然,当你创建多​​个onClick() 方法时,它们必须有不同的名称。
  • 另外,我建议您对创建对象实例和static 成员进行一些研究。互联网上有很多关于这两者的信息。

标签: java android android-studio static access-modifiers


【解决方案1】:
//non-static method 'enter(charsequence)' cannot be referenced from a static context

这意味着你需要一个 Score 的实例:

Score score = new Score();
score.enter(editTextScore.getText());

【讨论】:

  • 你是我的英雄,它的工作方式正是我想要的。谢谢。
【解决方案2】:

如果你想“转到你的第二个 java 文件”,你的意思是:你想根据你的班级分数实例化一个新对象。

如果你有这个对象,正如Gavriel 所说,你可以调用声明的方法。

静态变量或方法存在于类的上下文中,而不是对象实例的上下文中:例如,您可以定义一个静态字段,该字段统计所有创建的对象实例,并且您创建的每个对象都可以访问此静态字段并访问其内容。

类的成员变量只能在具体对象的上下文中访问,静态字段可以被所有对象使用。所以同时使用静态和非静态方法并没有错,但是你应该在正确的上下文中使用它们。

用一个简短的例子说明,它会变得更清楚。

public class Example {

   public static int instanceCounter = 0;

   private String memberVariable = null;

   public Example(String memberValue) {
      Example.instanceCounter++;
      this.memberVariable = memberValue;
   }

   public String getMemberVariable() {
      return this.memberVariable;
   }

   public static void main(String[] args) {
      System.out.println(Example.instanceCounter);

      Example ex1 = new Example("value1");
      Example ex2 = new Example("value2");
      Example ex3 = new Example("value3");

      System.out.println(ex1.getMemberVariable());
      System.out.println(ex2.getMemberVariable());
      System.out.println(ex3.getMemberVariable());

      System.out.println(Example.instanceCounter);
   }

}

如果执行该类会产生以下输出:

0
value1
value2
value3
3

如您所见,这三个对象确实具有三个不同的成员字段,它们具有相同的名称,并且每个对象对于同一字段可以具有不同的值。但是静态字段 instanceCounter 只存在一次,可以在类上下文中访问,而根本不存在对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2021-09-18
    • 2014-03-25
    • 2019-10-23
    相关资源
    最近更新 更多