繁体   English   中英

如何从其他类调用变量和方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM