【问题标题】:Why I don´t need to use static in my constructor method?为什么我不需要在构造方法中使用静态?
【发布时间】:2023-03-25 06:20:01
【问题描述】:

我正在使用名为 addCustomer 的静态方法在 Java 中创建一个类,该方法为我返回此类的一个实例,如下所示:

import java.util.ArrayList;

public class Customer {
    private ArrayList<Double> transactions;
    private String name;
        
    public static Customer addCustomer(String name, Double transaction){
        this.name = name;
        return new Customer();
    }
}

它在 addCustomer 方法的第一行给我一个错误

this.name = name;

因为我不能在静态方法中使用非静态变量,这对我来说完全有意义。但后来我尝试为同一个类创建一个私有构造函数(具有名称和事务值),并在我的 addCustomer 方法中使用它而不是 Customer()。 像这样:

    private Customer(String name, Double transaction){
        this.name = name;
        transactions = new ArrayList<Double>();
        transactions.add(transaction);
    }
    
    public static Customer addCustomer(String name, Double transaction){
        return new Customer(name,transaction);
    }

由于静态方法 addCustomer(),我认为我必须在构造函数中放置静态修饰符,但我的 IDE 说它不允许在构造函数中。而且,这对我来说没有任何意义,我可以像这样使用 addCustomer() 方法(在构造函数中没有静态),那么即使它不是静态方法和里面的变量,为什么我仍然可以使用它不是很好吗?

【问题讨论】:

  • 这是因为您将构造函数与 new 构造一起使用。这与调用方法完全不同。
  • 在静态方法中没有this
  • 实例方法,你调用一个实例。静态方法,你调用一个类。当您使用 new 运算符时,会在新实例上调用构造函数。它们与方法不同。
  • 构造函数是特殊的。您不需要现有实例来调用它们(这使它们感觉是静态的),但它们可以访问 this 引用(这使它们感觉非静态)。最好将它们视为与所有其他方法不同的自己的东西。

标签: java oop


【解决方案1】:

这就是我会做的:

import java.util.ArrayList;

public class Customer {
    private ArrayList<Double> transactions;
    private String name;

    public Customer(String name, Double transaction) {
        this.name = name;
    }
}

要获得Customer 类型,您只需使用Customer customer = new Customer(&lt;name&gt;, &lt;transaction&gt;)。如果您希望能够像上图所示调用Customer.addCustomer(&lt;name&gt;, &lt;transaction&gt;),您可以使用:

import java.util.ArrayList;

public class Customer {
    private ArrayList<Double> transactions;
    private String name;

    public Customer(String name, Double transaction) {
    this.name = name;
    }

    public static Customer addCustomer(String name, Double transaction) {
        return new Customer(name, transaction);
    }
}

构造方法需要与类同名(区分大小写)。它还需要是public ClassName,没有通常的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多