【问题标题】:Why do I need to make instantiate my class to call my method in the static method?为什么我需要实例化我的类才能在静态方法中调用我的方法?
【发布时间】:2019-03-11 14:18:51
【问题描述】:

我开始学习 Java 并且有一个小问题。我的类块中有一组实例,其中包含 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() 的访问修饰符更改为静态,但我的局部变量不是静态的

为什么我需要实例化?

【问题讨论】:

  • printCurrencies 是一个实例方法 - 它作用于类的 instance,因此您需要先创建一个实例。请注意,static 不是像 public/private 那样的 access 修饰符 - 它是一个修饰符,表示方法/字段/等是否与类型的实例或类型本身相关。另请注意,rupee 等变量是字段,而不是局部变量。代码中唯一的 local 变量是 cc。我建议在一本好的 Java 书籍或教程中详细了解 static 的含义。
  • 查看这个线程,了解静态方法和实例方法之间的区别。 stackoverflow.com/questions/11993077/…
  • 我建议你在问这些问题之前先学习 oops 概念。我相信下次你不会问..每个人都会遇到这种情况......别担心跨度>
  • 别忘了给对你有帮助的人点赞

标签: java methods instantiation


【解决方案1】:

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

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() 的访问修饰符更改为静态,但我的局部变量不是静态的。为什么我需要实例化?

在您明确创建非静态字段之前,它们的副本不存在。

【讨论】:

    【解决方案2】:

    将类视为对象的模式或配方。实例化时,您使用此特定模式创建对象。现在有一个可以访问的具有值的对象。模式(所以类)只有一个可以保存特定值的字段的描述。因此没有您可以访问的值。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2023-03-25
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多