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

时间:2015-04-09 00:21:08

标签: java class

我正在做一个家庭作业,我需要在一个类“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类型没有任何区别。

7 个答案:

答案 0 :(得分:1)

好吧,你肯定无法从一个类访问另一个类的私有成员变量。要访问不同类中的公共成员,您需要创建静态变量并按类引用它,或者创建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 :(得分:1)

要在另一个类中调用方法,您有两个选择。

选项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最佳实践提倡封装,这基本上是一个原则,即程序的其他部分应该只能看到它们需要的内容,并且每个类的内部工作不应该暴露给其他类。

你是如何实现这一目标的?简单;使用访问器和mutator方法(getter和setter)来访问和修改你的字段。

// 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世界的其余部分都是这样做的。

答案 2 :(得分:0)

如果numNickes在另一个类中,则无法调用它,因为它的作用域是私有的。

如果要访问私有范围变量,则必须编写一个方法来返回它。惯例通常是

public int getNumNickles(){
    return numNickles;
}

这是设计使用并允许保护您不想公开的变量。

那么你的输出就是 System.out.println(机器中有“+ myclass.getNumNickles()+”镍币。)

或者你可以将变量设为公共

public int numNickels;

但现在可以使用该类读取并写入任何人。

答案 3 :(得分:0)

您正在尝试从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类中的字段和方法。

答案 4 :(得分:0)

访问另一个类中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.");

答案 5 :(得分:0)

Java是一种Object-Oriented Programming语言。这实际上意味着一切都基于对象的概念。这些对象是以 fields methods 的形式提供数据的数据结构。您提供实现的每个类都需要一个实例的形式来实际执行某些操作。

以下示例显示,当您要创建班级的实例时,您需要使用 new CoinDispenser(100)拨打电话。在这种情况下,类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的内容。详细了解访问级别here

答案 6 :(得分:0)

首先,没有变量名numNickels会导致错误发生。 其次,要访问类coinDispenser的属性,您需要创建该类的对象,即

coinDispenser a=new coinDispenser();

通过这样做,您可以访问类coinDispenser的公共方法。考虑到属性numNickles是私有的,您有两个选项,即:
1.将numNickles更改为public,然后使用

访问它
a.numNickles

2。创建一个公共方法以在类coinDispenser

中获取私有属性
public int getNumNickles() {return numNickles;}

并使用

从HW1访问它
a.getNumNickles()