【问题标题】:Why use public and private to static members and method?为什么对静态成员和方法使用公共和私有?
【发布时间】:2012-03-28 19:16:11
【问题描述】:

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

【问题讨论】:

  • 您的问题不清楚 - 您不能将某些内容指定为公共 私有。无论静态成员还是实例成员,可访问性规则都是相同的……为什么您认为强制私有与公共对实例成员很重要,但对静态成员不重要?
  • 因为在创建类时可能有些值不应该被操纵,例如类圆应该总是有一个私有双倍 PI = 3.14.... 并且半径应该是公共的,因为它有时可能会有所不同。

标签: java


【解决方案1】:

不是必须的,但可以有static 方法和数据成员仅供内部使用。

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

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

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

每当创建对象Foo 时,static 计数器就会递增,因此您会为类的每个实例获得不同的 id。 (这个例子不是线程安全的)

【讨论】:

    【解决方案2】:

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

    例子:

    public class Test {
      private static int myattr = 0;
    
      public static void foo() {
        myattr = 2;
      }
    }
    

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

    【讨论】:

      【解决方案3】:

      是的,它是必需的。

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

      或者您希望静态变量对其他包不可见,然后不要将其声明为 public。

      【讨论】:

        【解决方案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);
        }
        

        【讨论】:

        • 好的,但是调用静态方法或静态字段的类或方法是否也必须是静态的?
        • 不,没有这样的规则。有(某种)相反的规则。你不能在静态方法中调用instanceMethod()(因为你需要一个实例来调用非静态方法)。
        【解决方案5】:

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

        我相信您的问题是由于一个普遍的误解,即访问修饰符适用于实例,但事实并非如此!

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            公共和私有关键字与可见性有关:您希望其他类可以访问哪些成员以及应该隐藏或封装哪些成员。 静态成员与整个类相关,而非静态成员对对象实例进行操作。

            【讨论】:

              【解决方案8】:

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

              我们访问类的静态方法的情况是 类(包含方法)不能被实例化,即不能为该类创建对象

              在某些情况下,两个不同的类可能具有同名的静态方法。在这种情况下,你想使用同一个类的方法而不是其他类的方法。

              【讨论】:

                猜你喜欢
                • 2011-05-23
                • 1970-01-01
                • 1970-01-01
                • 2014-10-26
                • 2015-02-10
                • 2013-12-17
                • 1970-01-01
                • 1970-01-01
                • 2012-10-25
                相关资源
                最近更新 更多