静态方法和非静态方法有什么区别?

2022-08-31 13:53:36

请参阅下面的代码片段:

代码 1

public class A {
    static int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
        short s = 9;
        System.out.println(add(s, 6));
    }
}

代码 2

public class A {
    int add(int i, int j) {
        return(i + j);
    }
}

public class B extends A {
    public static void main(String args[]) {
    A a = new A();
        short s = 9;
        System.out.println(a.add(s, 6));
    }
}

这些代码片段之间有什么区别?两者都输出为答案。15


答案 1

静态方法属于类本身,非静态(也称为实例)方法属于从该类生成的每个对象。如果你的方法做了一些不依赖于其类的各个特征的事情,请让它成为静态的(这将使程序的占用空间更小)。否则,它应该是非静态的。

例:

class Foo {
    int i;

    public Foo(int i) { 
       this.i = i;
    }

    public static String method1() {
       return "An example string that doesn't depend on i (an instance variable)";
    }

    public int method2() {
       return this.i + 1; // Depends on i
    }
}

您可以像这样调用静态方法:.如果您尝试使用方法2,它将失败。但这将起作用:Foo.method1()Foo bar = new Foo(1); bar.method2();


答案 2

如果您只有一个要使用该方法的实例(情况,情况),并且不需要多个副本(对象),则静态方法非常有用。例如,如果您正在编写一个方法,该方法登录到一个且只有一个网站,下载天气数据,然后返回值,则可以将其编写为静态,因为您可以在该方法中对所有必要的数据进行硬编码,并且您不会有多个实例或副本。然后,您可以使用下列方法之一静态访问该方法:

MyClass.myMethod();
this.myMethod();
myMethod();

如果要使用方法创建多个副本,则使用非静态方法。例如,如果要从波士顿、迈阿密和洛杉矶下载天气数据,并且可以从方法中执行此操作,而不必为每个单独的位置单独自定义代码,则可以非静态地访问该方法:

MyClass boston = new MyClassConstructor(); 
boston.myMethod("bostonURL");

MyClass miami = new MyClassConstructor(); 
miami.myMethod("miamiURL");

MyClass losAngeles = new MyClassConstructor();
losAngeles.myMethod("losAngelesURL");

在上面的示例中,Java 使用相同的方法创建了三个单独的对象和内存位置,您可以使用“boston”、“miami”或“losAngeles”引用单独访问这些对象和内存位置。您无法静态访问上述任何内容,因为 MyClass.myMethod();是对方法的泛型引用,而不是对非静态引用创建的单个对象的引用。

如果您遇到这样一种情况,即访问每个位置的方式或返回数据的方式完全不同,以至于您无法在不跳过很多箍的情况下编写“一刀切”的方法,则可以通过编写三个单独的静态方法(每个位置一个)来更好地实现目标。


推荐