我正在编写一个简单的接口类,如下所示。我只需要向用户提供其中一种方法。使用此类的用户只需要此特定方法的返回值(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);
}
}
有区别吗?
答案 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)
我猜你的问题很准确,比如“静态是什么意思?”。
对我而言,“静态”意味着,每个类只有一个变量,所有其他变量都来自该类。