【问题标题】:where the behavior of private and static method is different from only private method [duplicate]私有和静态方法的行为与仅私有方法不同的地方[重复]
【发布时间】:2015-07-05 12:21:19
【问题描述】:

就我的理解而言:

当一个方法是静态的时,它是

  1. 早绑定
  2. 在没有对象创建之前就可以调用类名
  3. 只能调用其中的静态成员。

我从未在编译时或运行时发现静态的任何其他行为。 有吗?

当一个方法是私有的时,它是

  1. 也早绑定
  2. 只能在调用内部调用,所以可以不带对象直接调用。

例如ArrayList 类中的hugeCapacity() 方法。

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 :
        MAX_ARRAY_SIZE;
} 

由于Java中存在私有+静态方法。为什么他们的需要发生。是否出于限制目的,限制方法内非静态变量的访问?

【问题讨论】:

  • 重点是静态方法与类型相关联,而不是与该类型的任何实例相关联,而实例方法与该类型的实例相关联。私人部分与此完全正交。 (例如,您可以在没有任何实例的情况下调用私有静态方法...)
  • @JonSkeet 实际上先生,至于私有方法是关心的-它们只能在类内部调用。当您可以直接通过其名称调用它们时,为什么要使用 ClassName.methodName 的开销来绑定它们。
  • @dubey-theHarcortians:如果您在同一个类(或子类)中调用静态方法,则不必指定ClassName。关键是,如果一个方法不能在逻辑上对类的实例进行操作,则应该将其设为静态 - 就这么简单。
  • 完全正确,先生。我也有同样的观点,因为私有方法具有与 prvate+static.each 相同的行为,并且静态方法的每个属性在私有方法的情况下都失去了存在。为什么需要私有+静态方法。是否出于限制目的,限制方法内非静态变量的访问?
  • 还有一件事希望你能尽快回答。这个静态私有方法在子类中是不可访问的:) @JonSkeet 正如你所说的——如果你在同一个类(或子类)中调用它。

标签: java static private access-specifier


【解决方案1】:

好吧,如果你不想公开一个方法到外部世界并且只在内部使用它,你可以将它们标记为private时间>。这也适用于static 方法。一个例子:

public class Sample {

    public static void main(String[] args) {
        SomeTestClass.display1(); // compilation error
        SomeTestClass.display2();
    }

}

class SomeTestClass {
    private static void display1() {
        System.out.println("displaying 1..");
    }

    public static void display2() {
        display1();
        System.out.println("displaying 2..");
    }
}

在上面的代码中,method1() 应该只在类SomeTestClass 中使用。这增加了抽象。

【讨论】:

  • “好吧,如果你不想将一个方法暴露给外部世界并且只在内部使用它,你可以将它们标记为静态。”不,您将其标记为私有...
  • @JonSkeet - 我的意思是 private,而不是 static。 (仍然是一个打字错误:P)纠正了它..
猜你喜欢
  • 2012-07-14
  • 2017-05-23
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2010-11-04
  • 2013-09-25
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多