为什么这个方法必须是静态的(Java)?

为什么这个方法必须是静态的(Java)?,java,static,Java,Static,关于一些背景知识,我现在正在读我的书的第8章,我们已经讲完了ArrayList、arrays、if语句、循环等。现在这部分书讨论了引用调用、值和一些其他一些非常简洁的东西,这些东西一开始对我来说似乎很奇怪。我已经阅读了一些其他的SO问题,也学到了很多 考虑我书中给出的以下示例(在众多示例中) 静态方法有时是必要的还有另一个原因。如果 方法操作的类不是您自己的,您不能将其添加到 那个班。考虑一个计算矩形区域的方法。 标准库中的矩形类没有这样的功能,并且 我们不能修改那个类。静态方法可解决此问题:

关于一些背景知识,我现在正在读我的书的第8章,我们已经讲完了ArrayList、arrays、if语句、循环等。现在这部分书讨论了引用调用、值和一些其他一些非常简洁的东西,这些东西一开始对我来说似乎很奇怪。我已经阅读了一些其他的SO问题,也学到了很多

考虑我书中给出的以下示例(在众多示例中)

静态方法有时是必要的还有另一个原因。如果 方法操作的类不是您自己的,您不能将其添加到 那个班。考虑一个计算矩形区域的方法。 标准库中的矩形类没有这样的功能,并且 我们不能修改那个类。静态方法可解决此问题:

现在我们可以告诉您为什么主方法是静态的。节目什么时候开始 开始时,没有任何对象。因此,第一种方法 程序必须是静态方法

好的,这很酷,到目前为止,我一直在盲目地把
public
放在我所有方法的前面,所以很高兴知道这一点。但是下一页的评论小问题引起了我的注意

以下方法计算数字数组列表的平均值:

公共静态双平均值(ArrayList值)
为什么必须是静态方法?

我在这里等了一会儿。我很确定我以前没有使用static。所以我又试了一次,很容易就得出了以下结论

import java.util.ArrayList;
class ArrList
{
    private double sum;

    public ArrList()
    {
        sum = 0;
    }

    public double average(ArrayList <Double> values)
    {
        for(int i = 0; i < values.size() ; i++)
        {
            sum+=values.get(i);
        }

        return sum / values.size();

    }
}

public class Average
{
    public static void main(String [] args)
    {
        ArrList arrListObj = new ArrList();
        ArrayList<Double> testArrList = new ArrayList<Double>();
        testArrList.add(10.0);
        testArrList.add(50.0);
        testArrList.add(20.0);
        testArrList.add(20.0);
        System.out.println(arrListObj.average(testArrList));

    }
}
import java.util.ArrayList;
类列表
{
私人双和;
公共资源清单()
{
总和=0;
}
公共双平均值(ArrayList值)
{
对于(int i=0;i
TLDR

为什么我的书中说
公共静态双平均值(ArrayList值)
需要是静态的

尝试使用静态

public class Average
{
    public static void main(String [] args)
    {
        ArrayList<Double> testArrList = new ArrayList<Double>();
        ArrayList<Double> testArrListTwo = new ArrayList<Double>();
        testArrList.add(10.0);
        testArrList.add(50.0);
        testArrList.add(20.0);
        testArrList.add(20.0);
        testArrListTwo.add(20.0);
        testArrListTwo.add(20.0);
        testArrListTwo.add(20.0);
        System.out.println(ArrList.average(testArrList));
        System.out.println(ArrList.average(testArrListTwo)); // we don't get 20, we get 53.3333!


    }
}
公共类平均值
{
公共静态void main(字符串[]args)
{
ArrayList testArrList=新的ArrayList();
ArrayList testArrListTwo=新的ArrayList();
测试列表。添加(10.0);
测试列表。添加(50.0);
testArrList.add(20.0);
testArrList.add(20.0);
TestArrList2.add(20.0);
TestArrList2.add(20.0);
TestArrList2.add(20.0);
System.out.println(ArrList.average(testArrList));
System.out.println(ArrList.average(testArrListTwo));//我们得到的不是20,而是53.3333!
}
}
  • 如果它不是
    静态的
    ,那么想要使用此方法的任何其他类都必须首先创建此对象的实例
  • 从其他类别:

    Average.average(new ArrayList<Double>()); // legal only if static
    new Average().average(new ArrayList<Double>()); // necessary if not static
    // and only makes sense if Average can be instantiated in the first place
    
    事情做得越少,就越容易理解它的作用

  • 如果它不是
    静态的
    ,那么想要使用此方法的任何其他类都必须首先创建此对象的实例
  • 从其他类别:

    Average.average(new ArrayList<Double>()); // legal only if static
    new Average().average(new ArrayList<Double>()); // necessary if not static
    // and only makes sense if Average can be instantiated in the first place
    
    事情能做的越少,就越容易理解它能做什么。

    它不能

    唯一需要是
    static
    的方法是初始的
    main()
    方法。作为程序员,任何其他事情都由您来决定在您的设计中什么是有意义的

    static
    public
    访问器(正如您所提到的)无关,也与正在执行的技术操作无关。它与操作的语义以及包含它的类有关

    类的特定实例上存在一个实例(非
    静态)方法。从语义上讲,它应该执行与特定实例相关的操作。
    静态方法通常存在于类上,更具概念性。它不会对特定实例做任何事情(当然,除非它提供了某个对象的实例作为方法参数)

    所以你只需要问问自己这个操作的语义。是否需要对象的新实例来执行操作?或者该操作是否应该在没有实例的情况下可用?这取决于操作、对象表示的内容等。

    它不是

    唯一需要是
    static
    的方法是初始的
    main()
    方法。作为程序员,任何其他事情都由您来决定在您的设计中什么是有意义的

    static
    public
    访问器(正如您所提到的)无关,也与正在执行的技术操作无关。它与操作的语义以及包含它的类有关

    类的特定实例上存在一个实例(非
    静态)方法。从语义上讲,它应该执行与特定实例相关的操作。
    静态方法通常存在于类上,更具概念性。它不会对特定实例做任何事情(当然,除非它提供了某个对象的实例作为方法参数)


    所以你只需要问问自己这个操作的语义。是否需要对象的新实例来执行操作?或者该操作是否应该在没有实例的情况下可用?这取决于操作、对象表示的内容等。

    静态方法,如
    区域
    平均
    通常是实用函数。你不需要任何对象来访问你
    Average.average(new ArrayList<Double>()); // legal only if static
    new Average().average(new ArrayList<Double>()); // necessary if not static
    // and only makes sense if Average can be instantiated in the first place
    
    // In the class body
    int x = 0; // member variable
    public static double average() {
        x = x + 1; // illegal
    }