Java 为什么对静态成员和方法使用public和private?

Java 为什么对静态成员和方法使用public和private?,java,Java,我正在学习Java,我只是想知道,当一个方法或成员是静态的时,为什么要使用public和private?当使用static时,它们是类方法和类成员,可以从其他类中使用,而无需创建对象,那么公共和私有是必要的吗?需要一些帮助才能理解。如果这个问题对某些人来说太简单,那么很抱歉。这不是必需的,但是可以有静态方法和数据成员,仅供内部使用 例如,如果您希望类的每个实例都有一个唯一的id: class Foo { private static int nextId = 0; private s

我正在学习Java,我只是想知道,当一个方法或成员是静态的时,为什么要使用public和private?当使用static时,它们是类方法和类成员,可以从其他类中使用,而无需创建对象,那么公共和私有是必要的吗?需要一些帮助才能理解。如果这个问题对某些人来说太简单,那么很抱歉。

这不是必需的,但是可以有
静态方法和数据成员,仅供内部使用

例如,如果您希望类的每个实例都有一个唯一的id:

class Foo
{
   private static int nextId = 0;
   private static int generateId() { return ++nextId; }
   private int id;
   public Foo()
   {
      id = generateId();
   }
}
如您所见,
nextId
generateId()
在类外不需要,也不应该在类外使用。类本身负责生成id。但是您需要它们是
静态的
(好吧,您需要
nextId
静态的
,但是您也可以使
generateId()
静态,因为它不访问非静态成员)


每当创建对象
Foo
时,
static
计数器都会递增,因此类的每个实例都会获得不同的ID。(此示例不是线程安全的)

这不是必需的,但是可以有
静态
方法和数据成员,仅供内部使用

例如,如果您希望类的每个实例都有一个唯一的id:

class Foo
{
   private static int nextId = 0;
   private static int generateId() { return ++nextId; }
   private int id;
   public Foo()
   {
      id = generateId();
   }
}
如您所见,
nextId
generateId()
在类外不需要,也不应该在类外使用。类本身负责生成id。但是您需要它们是
静态的
(好吧,您需要
nextId
静态的
,但是您也可以使
generateId()
静态,因为它不访问非静态成员)


每当创建对象
Foo
时,
static
计数器都会递增,因此类的每个实例都会获得不同的ID。(此示例不是线程安全的)

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

例如:

public class Test {
  private static int myattr = 0;

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

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

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

例如:

public class Test {
  private static int myattr = 0;

  public static void foo() {
    myattr = 2;
  }
}
如上所述,
myattr
必须是静态属性,才能在
foo()
方法中使用它。

是的,它是必需的

如果您有一个静态方法,并且希望在该方法中使用私有变量,那么您也需要将其声明为静态

或者您希望静态变量对其他包不可见,那么就不要将其声明为公共变量。

是的,这是必需的

如果您有一个静态方法,并且希望在该方法中使用私有变量,那么您也需要将其声明为静态


或者您希望静态变量对其他包不可见,那么就不要将其声明为公共的。

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

可以从外部访问静态方法,也可以从类本身内部(由其他静态或非静态方法)使用静态方法。田野也是如此

例如:

// 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);
}

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

可以从外部访问静态方法,也可以从类本身内部(由其他静态或非静态方法)使用静态方法。田野也是如此

例如:

// 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);
}
我正在学习Java,我只是想知道,当一个方法或成员是静态的时,为什么要使用public和private

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

如果两个不同的实例属于同一类,则它们可以访问彼此的私有成员

换句话说,访问修饰符在类级别工作。因为静态成员也属于某个类,所以在它们上也有访问修饰符是有意义的

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

我正在学习Java,我只是想知道,当一个方法或成员是静态的时,为什么要使用public和private

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

如果两个不同的实例属于同一类,则它们可以访问彼此的私有成员

换句话说,访问修饰符在类级别工作。因为静态成员也属于某个类,所以在它们上也有访问修饰符是有意义的


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

据我所知,实际上并不需要它。但是public基本上在任何编程语言中都意味着它可以被外部文件使用。使用private时,它只能在该文件中使用,static表示您无法更改所述引用的值。无论这些是函数还是变量,都适用相同的规则。我可能要走了。已经有一年半没有使用Java了


合并这些类型的方式取决于您。毕竟,程序的多样性取决于它的用户

据我记忆所及,这不是真的需要。但是public的意思是,基本上在任何编程语言中