为什么使用公共和私有静态成员和方法?

时间:2012-03-12 11:31:06

标签: java

我正在学习Java,我只是想知道为什么当一个方法或成员是静态的时使用公共和私有?当使用static时,它们是类方法和类成员,可以在不创建对象的情况下从其他类中使用,那么公共和私有是否必要?一些帮助可以预先理解。对不起,如果这个问题对某些人来说太简单了。

8 个答案:

答案 0 :(得分:4)

字段或方法的可访问性与它是否为静态的事实是正交的。

您可以从外部访问静态方法,并且只能从类本身内部(通过其他静态或非静态方法)使用静态方法。字段也是如此。

例如:

// not visible from the outside
private static final long MILLISECONDS_IN_A_MINUTE = 1000L * 60 * 60;

public static Date addMinutes(Date d, int amount) {
    return addMillis(d, MILLISECONDS_IN_A_MINUTE * amount);
}

// not visible from the outside
private static Date addMillis(Date d, long amount) {
    return new Date(d.getTime() + amount);
}

答案 1 :(得分:1)

  

我正在学习Java,我只是想知道为什么当方法或成员是静态的时使用公共和私有?

我相信你的问题是由于一个常见的误解,即访问修饰符是针对实例,但它们不是!

如果两个不同的实例属于同一个,则可以访问其他私有成员。

换句话说,访问修饰符适用于级别。由于静态成员也属于某个类,因此在它们上也有访问修饰符是有意义的。

只应由同一类中的代码使用的静态方法(或变量)(如JB Nizet的示例中所示)应该是私有的,而任何类中的代码可以使用的静态方法或变量应该是公开。

答案 2 :(得分:0)

没有必要,但可以有static方法和数据成员仅供内部使用。

这方面的一个例子是,如果你想为每个类的实例提供一个唯一的id:

class Foo
{
   private static int nextId = 0;
   private static int generateId() { return ++nextId; }
   private int id;
   public Foo()
   {
      id = generateId();
   }
}

如您所见,课堂外不需要nextIdgenerateId(),也不应在课堂外使用。staticnextId。类本身负责生成id。但是你需要它们static(嗯,你需要generateId()Foo,但你也可以static静态,因为它不会访问非静态成员)。

每当创建一个对象{{1}}时,{{1}}计数器就会递增,因此每个类的实例都会得到不同的id。 (这个例子不是线程安全的)

答案 3 :(得分:0)

假设您有一个静态公共方法,并且此方法必须访问私有属性。此私有属性也必须是静态的。私有静态存在的原因之一。

示例:

public class Test {
  private static int myattr = 0;

  public static void foo() {
    myattr = 2;
  }
}

以上,myattr必须是静态属性,才能在foo()方法中使用它。

答案 4 :(得分:0)

是的,这是必要的。

如果您有静态方法并且想在该方法中使用私有变量,那么您还需要将其声明为静态。

或者您希望静态变量对其他包不可见,然后不要将其公开。

答案 5 :(得分:0)

根据我的记忆,它并非真正需要。但 public 基本上在任何编程语言中都可以被外部文件使用。使用私有时,只能在该文件中使用,静态表示您无法更改所述引用的值。无论这些是函数还是变量,都适用相同的规则。我可能会离开。在大约一年半的时间里没有完成Java。

您可以合并这些类型的方式取决于您。毕竟,程序只是与用户一样多样化。 ^ _ ^

答案 6 :(得分:0)

公共和私有keywoards与可见性有关:您希望其他类可以访问哪些成员,哪些成员应该被隐藏或封装。 静态成员作为一个整体与类相关,而非静态成员则在对象实例上运行。

答案 7 :(得分:0)

当static与方法一起使用时,它不仅意味着它应该由其他类的成员使用。

当我们访问类的静态方法时,就是这种情况 无法实例化类(包含方法),即不能创建该类的对象

可能存在两个不同类可能具有相同名称的静态方法的情况。在这种情况下,您希望使用相同类的方法而不是其他类的方法。