使用静态方法

时间:2011-07-20 14:05:53

标签: java methods static

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

由于我是C程序员,我还是Java世界的新手。请查看我的代码的骨架,并告诉我所做的声明是否正确传达意义。

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类时,我会这样称呼它:

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);
    }
}

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

 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);
        }
    }

有区别吗?

5 个答案:

答案 0 :(得分:4)

通过实例和类调用静态方法在Java中功能相同。以下内容:

Iface.checkLink(<url>);

在功能上等同于

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

但请注意,后者不推荐,因为它令人困惑且不必要。可以说,由于a mistake by the Java language designers,它才被允许。

警告:在您的示例中,您没有初始化Iface变量。你仍然可以通过这个变量调用静态方法,但是如果你将它用于除静态方法之外的任何东西,你可能会遇到问题(你不应该在第一时间做这些!)。

事实上,你可能应该到make this class uninstantiable,因为它似乎是一个只有静态方法的实用类。

答案 1 :(得分:1)

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

因此,在执行方面,没有任何区别。在内存/垃圾收集方面,会有。

答案 2 :(得分:1)

当然有区别。

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

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

从引用对象调用它将起作用,但从逻辑上讲,它不是正确的含义。因为该方法不属于该对象,并且不会对该对象的实际状态起作用。

答案 3 :(得分:1)

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

protected关键字告诉Java只允许类在扩展Iface类时访问该变量。您没有在调用代码中扩展该类,因此如果方法不是public,则不应编译使用该方法的方法。

请注意,使方法static表示调用者需要直接使用Iface类,因此无法使用类继承。因此,如果您希望拥有另一个扩展Iface的类并覆盖checkLinks的实现,那么您需要使该方法成为非静态方法。

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

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

您可能还想对工厂模式和依赖注入模式进行一些研究,这使您可以更灵活地确定要使用的特定Iface实现。

答案 4 :(得分:0)

我猜你的问题很准确,比如“静态是什么意思?”。

对我而言,“静态”意味着,每个类只有一个变量,所有其他变量都来自该类。