===================================================================================================
更新:
我的问题是,我不知道课堂真的可以互相交流。例如,您可以创建两个类,实例化程序中每个类的一个对象,然后实际将一个对象传递给另一个对象。这不仅直接解决了我的问题,也为未来打开了一个充满可能性的世界。
public class FirstClass {
int valueToPass = 100;
void methodToPass(){
//do stuff
return;
}
}
public class SecondClass {
FirstClass passedInObject;
int valueFromOtherClass = passedObject.valueToPass;
return;
}
}===================================================================================================
我知道类是可以实例化为对象的属性和操作的蓝图。我知道内部类是在另一个类中定义的非静态类,并且可以访问外部类的数据。我理解子类是一个单独的文件,它定义了一个无法访问父类数据的类。
所以我有一个Android应用程序的主要活动类。我只是做一个简单的骰子游戏,以帮助解决所有松散的结局。我在单独的.java文件中定义了以下子类:
骰子ScoreCard
我实例化了一个由5个Dice对象和1个ScoreCard对象组成的数组,并将这些对象附加到android窗口中的“视图”中,然后通过对象内的set单击侦听器方法为该视图分配一个操作方法。这些物体工作得完美无缺。我可以点击骰子,他们将持有和取消自己,滚动,并更新自己的观点。当然,我可以通过引用主类的object.value变量来访问骰子的值。(据我所知,许多人认为访问器优于直接与子类变量直接交互,这个应用程序只是为了巩固应用程序整体流程的概念观念),我可以点击记分表上的一个插槽,它将切换突出显示作为指定得分的时隙。在每次交互之后,记分卡对象还会更新屏幕上的整个记分卡。
到目前为止一切都很好,一切都很顺利,我理解所有发生的事情。
但是,在我的主活动类中,我现在希望创建一个roll函数,并将该函数分配给roll按钮的单击侦听器。但是,当将函数分配给单击侦听器时,不能引用任何非最终变量,因为给定视图的单击侦听器实际上实例化了一个匿名对象(匿名类?)因此,您不能引用其他方法中定义的内部类中的任何非最终变量。换句话说,您不能将指定给单击监听器的函数传递给您的主类的任何值,尽管我不明白为什么,但我创建的roll函数不能直接访问主类的变量。
我的知识有第一个缺口,我读过几十本教程,看了十几个视频,但我不知道为什么我的滚动函数看不到变量。
public mainclass extends otherclass {
@override
otherclass.method {
// where my application starts
int a=7;
roll();
}
void roll(){
int funcVar = a;
return;
{
}Eclipse说a不能被解决。
我试着做一个公众的思考,这样可以让函数看到它,但是如果我改变了
int a=7;至
public int a=7;然后Eclipse说它不能是公开的,只能是最终的。
方法之一是创建一个名为Roll的新的子类,或者可能是ActionButton,以便在将来将它用于其他按钮,就像我对ScoreCard和Dice类所做的那样。这很好,因为我可以实例化一个roll按钮对象,为对象分配一个视图,然后将单击监听器设置为对象的一个方法。但是,这会将doesn按钮的功能从我的MainActivity类转移到我的rollbutton类,后者无法访问我的骰子和记分卡对象中的数据。换句话说,我不知道如何让我的孩子们互相交谈,我真的不认为他们应该这样做。我猜想主类应该独立地访问每个子类,但是如果是这样的话,我不太确定现在该做什么。
我能想到的唯一解决方案是将所有这些子类放入同一个子类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只是我为了简单起见而使用的一个例子。我确实需要访问我实例化的对象中包含的数据,如果我在更高的范围内实例化它们,应用程序在启动时突然结束。
发布于 2013-11-12 14:38:15
也许是变量和字段之间的混淆。字段是与对象关联的属性。变量只存在于方法的上下文中。当方法完成时,变量将消失。
另一方面,字段看起来与变量完全相同,只不过字段是在任何方法之外声明的,直接在类"body“上。字段和方法在同一层次上声明。您可以在Eclipse上看到这一点。检查“大纲”视图。
如果您需要几种方法来读取和写入相同的“变量”,那么您需要的是一个字段。我希望这能澄清。
发布于 2013-11-12 14:41:26
变量可以有不同的作用域
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
}
}方法中的局部变量仅在同一方法调用中可见(因此每次调用foo()时都使用新的局部变量)。
值可以通过将它们存储在实例或类变量(全局变量)中间接传递,但这很难看,而且容易出错。更好的变体是将值作为方法参数传递,这样可以很好地处理多个调用和多个线程,并消除使用全局变量传递值时可能产生的副作用。
在您的示例中,只需将a的值传递给您的方法:
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;
{
}https://stackoverflow.com/questions/19931770
复制相似问题