假设我有一个旨在实例化的类.我在类中有几个私有的"帮助器"方法,它们不需要访问任何类成员,并且只对它们的参数进行操作,返回结果.
public class Example {
private Something member;
public double compute() {
double total = 0;
total += computeOne(member);
total += computeMore(member);
return total;
}
private double computeOne(Something arg) { ... }
private double computeMore(Something arg) {... }
}
Run Code Online (Sandbox Code Playgroud)
有没有特别的理由指定computeOne和computeMore作为静态方法 - 或任何特殊原因不?
将它们保持为非静态是最容易的,即使它们肯定是静态的而不会引起任何问题.
由于私有方法是隐式最终的.
私有或静态或最终方法是早期绑定意味着它们不能被覆盖.
但在我的代码中,它实际上正常运行.
public class B extends A {
public static void main(String[] args) {
new B().privateMethod(); //no error -output B-privateMethod.
}
private void privateMethod() {
System.out.println("B-privateMethod.");
}
}
class A{
private void privateMethod() {
System.out.println("A-privateMethod.");
}
private static void privateStaticMethod() {
System.out.println("privateStaticMethod.");
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我想确保使私有成员静态的好处,除了可以使用class-name.member,而不是类中的非静态成员.它们是私人的,所以不能在课外使用.例如hugeCapacity(),ArrayList类中的方法.
private static final int DEFAULT_CAPACITY = 10;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE : …Run Code Online (Sandbox Code Playgroud) 可能重复:
方法何时应该是静态的?
通常在为类编写静态方法时,可以使用该方法访问该方法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());
}
}
Run Code Online (Sandbox Code Playgroud)
我看了几个教程.例如http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
我对它的理解是,不是创建一个类的实例来使用该方法,而是可以使用类名 - 在某些情况下节省内存,每次使用特定方法构建对象都没有意义.