通常在为类编写静态方法时,可以使用ClassName.methodName
访问该方法。在这个简单的例子中使用'static'的目的是什么?为什么应该/不应该在这里使用它?私有静态也会破坏使用静态的目的吗?
public class SimpleTest {
public static void main(String[] args) {
System.out.println("Printing...");
// Invoke the test1 method - no ClassName.methodName needed but works fine?
test1(5);
}
public static void test1(int n1) {
System.out.println("Number: " + n1.toString());
}
//versus
public void test2(int n1) {
System.out.println("Number: " + n1.toString());
}
//versus
private static void test3(int n1) {
System.out.println("Number: " + n1.toString());
}
}
我看了几个教程。例如。 http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
我对它的理解是,不是创建一个类的实例来使用该方法,你可以只使用类名 - 节省内存,因为在某些情况下,每次使用特定的对象构造对象都没有意义方法
答案 0 :(得分:4)
static
关键字的目的是能够在不创建类实例的情况下使用成员。
这就是这里发生的事情;调用所有方法(包括私有方法)而不创建SimpleTest
的实例。
答案 1 :(得分:1)
static
表示该函数不需要调用类的实例。而不是:
SimpleTest st = new SimpleTest();
st.test2(5);
你可以致电:
SimpleTest.test1(5);
您可以在this article中阅读有关静态方法的更多信息。
关于private static
的问题有already been asked here。要带走的重要部分是:
私有静态方法本身并不违反OOP,但是当你在一个不需要(也不能*)访问实例字段的类上有很多这些方法时,你就不会以OO方式编程,因为“对象”意味着状态+操作在一起定义的那个状态。如果他们不需要任何状态,为什么要将这些方法放在该类上? -eljenso
答案 2 :(得分:1)
在本例中,Static用于直接访问方法。私有静态方法违背了“数据隐藏”的目的。
你的main可以直接调用test1方法,因为它也是Static,它不需要任何对象进行通信。Main
不能引用non-static
成员,或者任何其他非静态成员都不能引用静态构件。
"non-static members cannot be referred from a static context"
有关静态成员的详细信息,请参阅This thread。
答案 3 :(得分:0)
static
表示该方法与类的实例无关。
它与public
/ protected
/ private
正交,这决定了该方法的可访问性。
答案 4 :(得分:0)
您将静态方法放在与您的类的特定实例无关的所有计算中。
关于可见性,public static
用于导出功能,而private static
用于独立但内部使用。
例如,假设您要为类的每个实例分配唯一标识符。为您提供下一个ID的计数器与任何特定实例无关,您也不希望外部代码对其进行修改。所以你可以这样做:
class Foo {
private static int nextId = 0;
private static int getNext () {
return nextId ++;
}
public final int id;
public Foo () {
id = getNext(); // Equivalent: Foo.getNext()
}
}
如果在这种情况下您还希望从类外部知道已创建了多少个实例,则可以添加以下方法:
public static int getInstancesCount () {
return nextId;
}
关于ClassName.methodName
语法:它很有用,因为它指定了提供静态方法的类的名称。如果你需要从类中调用方法,你可以忽略第一部分,因为名称methodName
在命名空间方面最接近。
答案 5 :(得分:0)
在示例中从test1
调用main
而不使用类名,因为test1
是与main
在同一类中的静态方法。如果您想从test2
调用main
,则需要首先实例化该类的对象,因为它不是静态方法。
答案 6 :(得分:0)
当该方法在同一个类中时,静态方法不需要使用类名限定。 方法是私有的(静态的或非静态的)仅仅意味着它不能从另一个类访问。 实例方法(在您的示例中为test2)只能在类的实例上调用,即:
new SimpleTest().test2(5);
答案 7 :(得分:0)
由于main是一个静态方法,如果你想调用类的方法而不必实例化它,你需要使这些方法也是静态的。
关于使私有方法静态,它具有比其他方法更多的可读性。引擎盖背后并没有那么大的差异。