关于java:使用静态方法

Use of Static Methods

我正在编写一个简单的接口类,如下所示。我只需要让它的一个方法对用户可用。使用这个类的用户只需要这个特定方法的返回值(checkLink)。因此,我将此方法单独声明为受保护的,因此它只对调用Iface类的用户可见。由于类中的其余方法将在类中使用,因此它们已声明为私有。我添加了静态关键字,因为这些方法有点"无状态"。我在类变量中使用了静态final关键字,因为我需要类似C的定义。

由于我是C程序员,我对Java世界还是陌生的。请看一下我的代码框架,告诉我所做的声明是否正确地表达了其含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.prog.Test;
import java.net.*;
import java.io.*;

public class Iface{  

    private static final int MSG_OK     =   0x01;
    private static final int MSG_NOK    =   0x00;  
    private static final int MSG_FAIL   =   0xFF;    

    private static byte[] getBytesFromUrl(URL link) throws IOException {
        ......                  
        return bytes;
    }              

    private static int[] msg_header(byte[] msg) throws Exception
    {
        int len = msg.length;
        System.out.println("len ="+len);
        int[] headerMsg =new int [3];
        headerMsg[0]= MSG_OK;
            ......

        return headerMsg;
    }

    private static byte[] Tobyte(int[]src) {
            ....
    }

    protected static int checkLink (URL url ) throws IOException {

       byte[] rbuffer = null;
       byte[] hdr = null;
       int status = -1;

        try{            
            rbuffer = getBytesFromUrl(url);
            ..
            ..
            hdr = Tobyte(msg_header(rbuffer));
            ...
            ...
            status = 0;

        }catch (Exception e) {
            System.err.println("Exception: " + e);
        }
        return status;

  }
}

所以当我在一个应用程序中使用这个Iface类时,我这样称呼它:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Trial {  

    public static void main (String [] args ) throws IOException {

        URL url = new URL("http://localhost:8000/myfile");

        System.out.println("Calling Iface");

        int retval = Iface.checkLink(url);      

        System.out.println("retval ="+retval);
    }
}

我也尝试过这个方法(在删除checkLink()方法中的static关键字之后):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class Trial {  

        public static void main (String [] args ) throws IOException {

            URL url = new URL("http://localhost:8000/myfile");

            System.out.println("Calling Iface");

                Iface callInterface;

            int retval = callInterface.checkLink(url);      

            System.out.println("retval ="+retval);
        }
    }

有什么区别吗?


在爪哇中,通过实例和类调用静态方法在功能上是等价的。下列内容:

1
Iface.checkLink(<url>);

在功能上等同于

1
2
Iface foo = new Iface();  // or Iface foo;   but with the caveats below
foo.checkLink(<url>);

但是,请注意,不建议使用后者,因为它既混乱又不必要。有人认为这是因为Java语言设计者的错误而被允许的。

警告:在您的示例中,您没有初始化您的Iface变量。您仍然可以通过这个变量调用静态方法,但是,如果您将静态方法用于除静态方法之外的任何其他用途,则很可能会遇到问题(首先不应该这样做!).

实际上,您应该尽量使这个类不可实例化,因为它似乎是一个只包含静态方法的实用程序类。


从技术上讲,您发布的代码示例都不起作用。

EDCOX1的"5"关键字告诉Java只允许类访问该变量,如果它们扩展了EDCOX1×0类。您没有在调用代码中扩展类,因此如果方法不是public,使用该方法的方法都不应该编译。

请注意,使方法static意味着调用方将需要直接使用Iface类,这使得不可能使用类继承。因此,如果您希望有另一个扩展Iface并重写checkLinks的实现的类,那么您将希望使该方法非静态。

如果该方法是非静态的,您可以这样使用它:

1
2
Iface callInterface = new Iface();
int retval = callInterface.checkLink(url);

您可能还需要对工厂模式和依赖注入模式进行一些研究,这将使您在确定要使用的特定Iface实现时具有更大的灵活性。


当然有区别。

静态方法不是对象的成员,它们属于类。

因此,如果checkLink()是静态的,那么您应该从类本身调用它:IFace.checkLink()

从一个对象的引用中调用它是可行的,但从逻辑上讲,它不是正确的含义。因为该方法不属于该对象,并且无法处理该对象的实际状态。


对,通过这样做:Iface callInterface;您正在创建一个类Iface的实例,从而在内存中保留一些空间。但是,您仍然在执行静态方法,因此不能使用任何实例方法/属性。

所以在执行方面,没有什么区别。在内存/垃圾收集方面,会有。


我想你的问题会很准确,就像"静电是什么意思?".

对于我来说,简单的"静态"意味着,这些变量在每个类中只存在一次,所有其他变量都在来自该类的每个对象中。