[英]How do I call variables and methods from other classes?
我正在做作业,我需要在一个类“ coinDispenser”中创建方法,并在主类“ HW1”中调用它们
不过,我不确定这是如何工作的。 这是我在coinDispenser.java中的代码示例:
private int numNickles = 0;
然后稍后在HW1.java中调用该方法:
System.out.println("There are "+numNickles+" nickles in the machine.")
但是我总是收到错误“ numNickles无法解析为变量”,并且它希望我在HW1类中创建整数。
如何在HW1.java中调用整数? 将整数更改为public int类型没有任何区别。
好吧,您绝对不能从一个类访问另一个类的私有成员变量。 为了访问其他类中的公共成员,您需要创建一个静态变量并按类引用它,或者创建一个CoinDispenser实例,然后引用该变量。
因此,在CoinDispenser中,它将是:
public int numNickles = 0;
在HW1中,您将拥有:
CoinDispenser cd = new CoinDispenser();
System.out.println("There are "+ cd.numNickles + " nickles in the machine.")
如果您做了一个静态变量,您也可以这样做:
CoinDispenser.numNickles
要调用另一个类中的方法,您有两个选择。
选项1:
您可以将方法声明为static
,这意味着不需要在对象上调用该方法。
注意:如果采用这种方式(不应该这样做;使用静态方法通常是不好的),则必须将numNickles
声明为static
,这意味着无论您创建多少个CoinDispenser
对象,此字段只有一个实例。
例:
static void methodToCallName(any arguments it takes) {
//...do some stuff...//
}
选项2:您可以使用包含方法的new
关键字创建类的实例,然后调用该方法:
例:
// in some method in the HW1 class (Which is a horrible class name, see java conventions)
CoinDispenser dispenser = new CoinDispenser(any parameters here);
coinDispenser.whateverYourMethodIsCalled(any arguments it takes);
面向对象语言中类的整体思想是使单独的事物保持分离。 当您引用另一个类中定义的变量时,必须告诉程序它在哪里。
我觉得您还没有真正了解面向对象的含义,因此您应该更多地研究它。 你不能伪造它。 没有绕过面向对象的方向。 您必须学会爱它。 当然,它会使简单的事情变得困难,但会使困难的事情变得如此简单。
对于您问题的第二部分...
请注意,实际上与其他用户所说的相反, numNickles
应该是私有的。
Java最佳实践主张封装,这基本上是一个原则,即程序的其他部分应该只能看到它们需要的内容,并且每个类的内部工作都不应暴露给其他类。
您如何实现的? 简单; 使用访问器和更改器方法(获取器和设置器)访问和修改您的字段。
// Define your field like usual...
private int numNickles = 0;
// ...and add these two methods...
public void setNumNickles(int value) {
numNickles = value;
}
public int getNumNickles() {
return numNickles;
}
对于变量来说,这似乎需要做很多工作,但是许多IDE会为您自动执行该过程,从长远来看,它将使您免受许多令人沮丧的错误的困扰。 习惯它,因为Java世界的其余部分都做到了。
如果numNickes在另一个类中,则不能调用它,因为它的作用域是私有的。
如果要访问私有作用域变量,则必须编写一个方法将其返回。 该约定通常是
public int getNumNickles(){
return numNickles;
}
这是设计使然,可以保护您不想公开的变量。
然后,您的输出将是System.out.println(“机器中有” + myclass.getNumNickles()+“刻痕。”)
或者,您可以将变量公开
public int numNickels;
但是现在,使用该类的任何人都可以读取和写入该文件。
您正在尝试从CoinDispenser类访问名为numNickles
的字段(BTW CoinDispenser是Java类的正确名称)。 您不能直接访问HW1类中的字段和方法。 因此,正如MadProgrammer在您的问题下的注释中所指出的那样,请按照以下说明进行操作。
在您的HW1.java类中,类似以下内容:
CoinDispenser cd = new CoinDispenser();
System.out.println("There are "+cd.getNumNickles()+" nickles in the machine.");
上面的代码行中的“ cd”是您在CoinDispenser类上的句柄。 使用cd,您可以从使用上述各行的任何类中访问(通过打点)字段和方法。 此外,如果这些字段和方法是“私有的”,您仍将无法访问您的CoinDispenser类中的字段和方法。
访问另一个类中的private
字段的标准方法是使用getter
方法。
这就像
private int numNickles = 0;
public int getNumNickles () {
return numNickles;
}
setter
方法也很有用
public void setNumNickles (int numNickles) {
this.numNickles = numNickles;
}
单击按钮,许多IDE(例如Eclipse)将自动为您创建这些方法。
然后可以在CoinDispenser类的实例上调用这些方法。
CoinDispenser coinDispenser = new CoinDispenser ();
coinDispenser.setNumNickles (23);
System.out.println("There are "+ coinDispenser.getNumNickles() + " nickles in the machine.");
Java是一种面向对象的编程语言。 从本质上讲,这意味着一切都基于对象的概念。 这些对象是数据结构,以字段和方法的形式提供数据。 您提供的每个实现的类都需要一种实例形式,才能实际对其执行操作。
以下示例显示,当您要创建类的实例时,需要使用new
CoinDispenser(100)
进行调用。 在这种情况下,类CoinDispenser
的构造CoinDispenser
需要一个参数,即硬币数量。 现在要访问新制作的CoinDispenser的任何字段或方法,您需要使用variable.method()
调用该方法,因此在本例中为coinDispenser.getCoins()
来检索我们的书名。
public class CoinDispenser {
private int coins = 100; // Set the amount of coins
public int getCoins() {
return coins;
}
}
public class HW1 {
public static void main(String[] args) {
CoinDispenser coinDispenser = new CoinDispenser(100);
System.out.println("I have " + coinDispenser.getCoins() + " left.");
}
}
注意:我们正在使用一种额外的方法getCoins()
,即一个getter,以获取字段coins
的内容。 在此处阅读有关访问级别的更多信息。
首先,没有导致错误发生的变量名numNickels。 其次,要访问coinDispenser类的属性,您将需要创建该类的对象,即
coinDispenser a=new coinDispenser();
这样,您就可以访问类coinDispenser的公共方法。 考虑到属性numNickles是私有的,您有两个选择,即:
1.将numNickles更改为public,然后使用
a.numNickles
2.创建一个公共方法以在coinDispenser类中获取私有属性
public int getNumNickles() {return numNickles;}
并使用HW1访问它
a.getNumNickles()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.