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

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操作系统窗口中的一个“视图”中,然后将一个action方法分配给该视图,其中包含set click listener方法。这些物体工作得完美无缺。我可以点击骰子,他们将举行和取消自己的旧,滚动,并更新自己的看法。当然,我可以通过引用它们的object.value变量从主类中访问骰子的值。(我知道许多人认为访问器优于直接与子类变量交互,这个应用程序只是为了巩固应用程序整体流程的概念性想法)我可以单击记分表上的一个槽,它将切换该槽作为分配分数的槽的突出显示。记分卡对象还会在每次交互后更新屏幕上的整个记分卡。
到目前为止,一切都很好,我理解正在发生的一切。
但是,在我的主活动类中,我现在想要创建一个roll函数,并将该函数分配给roll按钮的click监听器。但是,当为click监听器分配函数时,不能引用任何非最终变量,因为给定视图的click监听器实际上实例化了一个匿名对象(匿名类?)并用自己的方法重写onclick方法,因此不能从另一个方法中定义的内部类引用任何非最终变量。换句话说,您不能从您的主类中向click listener传递任何值,尽管我不明白为什么,但是我创建的roll函数不能直接访问主类的变量。
我的知识有第一个缺口,我读了几十本教程,看了十几个视频,但我不知道为什么我的roll函数看不到变量。
public mainclass extends otherclass {
      @override
      otherclass.method {
             // where my application starts
             int a=7;
             roll();
      }

      void roll(){
          int funcVar = a;
          return;
      {
}

日食说A不能解决。
我试着让一个公开的想法让这个函数看到它,但是如果我改变
int a=7;


public int a=7;

然后eclipse说它不能公开,只能是最终的。
解决这个问题的方法是创建一个名为roll的新子类,或者可能是actionbutton,以便将来将其用于其他按钮,就像我对记分卡和骰子类所做的那样。这很好,因为我可以实例化一个滚动按钮对象,为该对象分配一个视图,然后将单击侦听器设置为该对象的一个方法。但是,这会将rollbutton的功能从mainActivity类传输到rollbutton类,后者无权访问dice和scorecard对象中的数据。换言之,我不知道如何让我的孩子们互相交谈,我甚至不认为他们应该这样做。我认为主类应该独立访问每个子类,但如果是这样的话,那么我不确定此时我应该做什么。
我能想到的唯一解决方案是将所有这些子类放在同一个子类dicegame中,并且几乎只需使用mainActivity类来实例化dicegame类的一个对象,并将处理完全转移到该对象。虽然这样可以工作,但是类中的所有方法都可以访问类中的所有数据,这似乎与面向对象编程的整个目的相矛盾。
是因为android应用程序中的点击监听器是通过实例化一个不能访问任何非最终变量的匿名内部类来分配的,还是我只是在java应用程序的结构中遗漏了一个关键概念?
很抱歉这么长时间了,但我实在无法缩短时间,仍然无法传达整个问题。
----编辑------
    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;
}

}/类结束
增加a范围的建议实际上起了作用。然而,为了简单起见,a只是我使用的一个示例。我真的需要访问我实例化的对象中包含的那些数据,如果我在更高的范围内实例化它们,应用程序在启动时会突然终止。

最佳答案

也许混淆的是变量和字段。字段是与对象关联的属性。变量仅存在于方法的上下文中。方法完成后,变量将消失。
另一方面,字段看起来与变量完全相同,只是字段是在任何方法外部直接在类“body”上声明的。字段和方法在同一层次结构级别声明。你可以在日食上看到。检查“大纲”视图。
如果您需要几个方法来读写同一个“变量”,那么您需要的是一个字段。我希望这能澄清。

关于java - Java知识不足,但找不到搜索方向,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19931770/

10-11 21:16