为什么需要实例化我的类以在静态方法中调用我的方法?

时间:2018-10-06 06:37:43

标签: java methods instantiation

我开始学习Java并遇到一个nooby问题。我的类块中有一组实例,其中包含2个方法,1个主静态实例和1个void

public class CurrencyConverter {
    int rupee = 63;
    int dirham = 3;
    int real = 3;
    int chilean_peso = 595;
    int mexican_peso = 18;
    int _yen = 107;
    int $austrailian = 2;
    int dollar = 0;
    int Rupee = 63;

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
        CurrencyConverter cc = new CurrencyConverter();
        cc.printCurrencies();
    }

    void printCurrencies() {
        System.out.println("rupee: " + rupee);
        System.out.println("dirham: " + dirham);
        System.out.println("real: " + real);
        System.out.println("chilean_peso: " + chilean_peso);
        System.out.println("mexican_peso: " + mexican_peso);
        System.out.println("yen: " + _yen);
        System.out.println("australian: " + $austrailian);
        System.out.println("dollar: " + dollar);
        System.out.println("Rupee: " + Rupee);                
    }       
}

现在是我的问题,为什么我需要实例化CurrencyConverter类才能调用printCurrencies()?您通常不能只调用方法吗?我在同一堂课吗?

我尝试将printCurrencies()的访问修饰符更改为静态,但随后我的局部变量不是静态的

为什么需要实例化?

2 个答案:

答案 0 :(得分:0)

将类视为对象的模式或配方。实例化时,您将使用此特定模式创建一个对象。现在有一个可以访问值的对象。模式(因此是类)仅具有可以包含特定值的字段的描述。因此,您无法访问任何值。

现在是静态变量: 静态字段是在运行时开始时创建的字段。因此,您可以随时访问该值而无需创建对象,因为它们不属于对象而是属于特定类。

您摆脱实例化的解决方案是使该类的所有成员变为静态。

(请记住:每个const成员都是静态的)

答案 1 :(得分:0)

非静态字段与实例相关联。每个实例都具有一个这些字段的副本。

public class CurrencyConverter {
    int rupee = 63; // non static instance field
    int dirham = 3; // non static instance field
    // etc.
  

为什么我需要实例化CurrencyConverter类才能调用printCurrencies()?

没有实例,您的副本数为零,因此无打印内容。

  

您通常不能只调用方法吗?

如果将方法设为静态并删除对实例字段的所有引用,那么可以。这样可以很好地运行,但是不再有用。

public static void main(String[] args) {
    printCurrencies();
}

static void printCurrencies() {
}  
  

我在同一个班级里?

不确定您的意思,但是只有一堂课,所有内容都在其中。

int rupee = 63;
int Rupee = 63;

除非您喜欢混淆,否则请勿这样做。您应该在名称中明确说明每个字段的不同用途。

  

我尝试将printCurrencies()的访问修饰符更改为静态,但是我的局部变量不是静态的。为什么需要实例化?

除非明确创建非静态字段,否则不存在它们的副本。