Java知识方面的差距,但可以';我找不到搜索的方向

Java知识方面的差距,但可以';我找不到搜索的方向,java,android,class,scoping,Java,Android,Class,Scoping,=================================================================================================== 更新: 我的问题是,我不知道类确实可以相互通信。例如,您可以创建2个类,实例化程序中每个类的一个对象,然后将一个对象传递给另一个对象。这不仅直接解决了我的问题,而且为未来打开了一个充满可能性的世界 public class FirstClass { int valueToPass = 100

===================================================================================================

更新:

我的问题是,我不知道类确实可以相互通信。例如,您可以创建2个类,实例化程序中每个类的一个对象,然后将一个对象传递给另一个对象。这不仅直接解决了我的问题,而且为未来打开了一个充满可能性的世界

public class FirstClass {
    int valueToPass = 100;
    void methodToPass(){
    //do stuff
    return;
    }
}
public class SecondClass {
    FirstClass passedInObject;
    int valueFromOtherClass = passedObject.valueToPass;
    return;
    }
}
===================================================================================================

我理解类是可以实例化为对象的属性和操作的蓝图。 我知道内部类是在另一个类中定义的非静态类,可以访问外部类的数据。 我知道子类是一个单独的文件,定义了一个不能访问父类数据的类

我有一个Android应用程序的主要活动类。我只是在做一个简单的骰子游戏来帮助解决所有的问题。我在单独的.java文件中定义了以下子类:

掷骰子 记分卡

我实例化了一个由5个骰子对象和1个记分卡对象组成的数组,并将这些对象附加到android操作系统窗口中的“视图”中,然后使用对象中的set click listener方法为该视图分配一个动作方法。这些物体工作完美无瑕。我可以点击骰子,他们将持有和取消持有自己,滚动,并更新自己的看法。当然,我可以通过引用它们的object.value变量从主类访问骰子的值。(我知道很多人认为访问者比直接与子类的变量交互要好,这个应用程序只是为了巩固应用程序整体流程的概念性想法)我可以单击计分表上的某个槽,它会将该槽作为分配分数的槽来切换高亮显示。每次交互后,记分卡对象还会更新屏幕上的整个记分卡

到目前为止,一切都很好,我理解正在发生的一切

但是,在我的主活动类中,我现在想要创建一个roll函数,并将该函数分配给roll按钮的click侦听器。但是,如果将函数分配给click listener,则不能引用任何非最终变量,因为给定视图的click listener实际上实例化了view类的匿名对象(匿名类?),并使用自己的方法重写onclick方法,因此,您不能从另一个方法中定义的内部类引用任何非最终变量。换句话说,您不能将主类中的任何值传递给click侦听器,尽管我不明白为什么,但我创建的roll函数不能直接访问主类的变量

我的知识有第一个缺口,我读了几十本教程,看了十几个视频,但我不知道为什么我的滚动函数看不到变量

public mainclass extends otherclass {
      @override 
      otherclass.method {
             // where my application starts
             int a=7;
             roll();
      }

      void roll(){
          int funcVar = a;
          return;
      {
}
Eclipse说,无法解决问题

我试着让公众认为可能允许函数看到它,但是如果我改变

int a=7;

然后Eclipse说它不能是公共的,只能是最终的

解决这个问题的一种方法是创建一个名为Roll的新子类,或者可能是ActionButton,以便将来将其用于其他按钮,就像我对ScoreCard和Dice类所做的那样。这非常有效,因为我可以实例化roll button对象,为该对象指定一个视图,然后将click listener设置为该对象的一个方法。但是,这将我的rollbutton的功能从我的MainActivity类转移到我的rollbutton类,该类无权访问我的骰子和记分卡对象中的数据。换句话说,我不知道如何让我的孩子们互相交谈,我真的不认为他们应该这样。我想象主类应该独立地访问每个子类,但是如果是这样的话,那么我不确定此时应该做什么

我能想到的唯一解决方案是将所有这些子类放在同一个子类DiceGame中,并且几乎只使用MainActivity类实例化DiceGame类的一个对象,并将处理完全转移到该对象。虽然这样做可行,但类中的所有方法都可以访问类中的所有数据,这似乎与面向对象编程的整个目的相矛盾

这一切都是因为android应用程序中的点击监听器是通过实例化一个无法访问任何非最终变量的匿名内部类来分配的,还是因为我在Java应用程序的结构中遗漏了一个关键概念

很抱歉,这太长了,但我真的无法缩短它,并且仍然传达整个问题

-------编辑----------

公共类MainActivity扩展活动{
公共INTA=7;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
setContentView(R.layout.activity_main);
//我的申请从这里开始
骰子[]游戏骰子=新骰子[6];

对于(int i=1;i可能是变量和字段之间的混淆。字段是与对象关联的属性。变量仅存在于方法的上下文中。当方法完成时,变量消失

另一方面,字段看起来与变量完全相同,只是字段是在任何方法之外直接在类“body”上声明的。字段和方法是在同一层次上声明的。您可以在Eclipse上看到这一点。检查“outline”视图

如果你需要几个方法来读写同一个“变量”,那么你需要的是一个字段
public int a=7;
    public class MainActivity extends Activity {

public int a=7;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

            // my application starts here

    Dice[] gameDice = new Dice[6];

    for (int i=1;i<6;i++) gameDice[i]= new Dice();
    for (int i = 1; i<6 ; i++){
        gameDice[i].dieView = (ImageView) findViewById(R.id.die1 + (i-1));
        gameDice[i].setListener();
    }


    int[] slotId = new int[] {R.id.val1,
            R.id.val1,R.id.val2,R.id.val3,R.id.val4,R.id.val5,
            R.id.val6,R.id.valsubtotal,R.id.valbonus,

            R.id.val3k,R.id.val4k,R.id.val5k,R.id.valfh,
            R.id.valsmstr,R.id.valstr,R.id.valdicey,R.id.valtotal
    };


    ScoreCard scoreCard = new ScoreCard();
    scoreCard.NUMBER_OF_SLOTS = slotId.length;
    for (int i=1 ; i<scoreCard.NUMBER_OF_SLOTS ; i++){
        scoreCard.slotView[i]=(TextView) findViewById(slotId[i]);
        if (i!=8 && i!=15) scoreCard.setListener(i);
    }
    scoreCard.initScoreCard();


    rollButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            roll();

        }
    });
}// end of overridden method

void roll(){
//do stuff
int funcVar = a; // can totally see a now that it is higher scope
return;
}
public class MyClass {

   static int a; // variable bound to class MyClass, seen from all instances
   int b; // variable bound to instance, each instance of MyClass has its own value

   public void foo(int c) { // parameter variable: local
      int d; // local variable
   }
}
public mainclass extends otherclass {
      @override 
      otherclass.method {
             // where my application starts
             int a=7;
             roll(a);
      }

      void roll(int funcVar){
          // funcVar is whatever value was passed, here: 7
          return;
      {
}