【问题标题】:Why static object of non-static class cannot be created inside a method?为什么不能在方法内创建非静态类的静态对象?
【发布时间】:2015-10-07 01:52:06
【问题描述】:

我可以看到非静态类的静态对象不能在方法内部创建?

代码:

  public class Rent {

      public void abc() {
          System.out.println("Non static method");
      }
      public static void def() {
          System.out.println("this is static method");
      }
  }

  public class SampleJava {

      public static void main(String[] args) {
          Rent r1 = new Rent();
          public static Rent r2; //not allowed in static method
      }

      public static Rent r3; //allowed outside method

      public void def() {
          Rent r4 = new Rent();
          public static Rent r5; //not allowed in non-static method either
      }
  }

【问题讨论】:

标签: java static


【解决方案1】:

您需要考虑以下几点:

  1. 静态数据类似于静态方法。它与实例无关。声明为静态的值没有关联的实例。它存在于每个实例中,并且仅在内存中的一个位置声明。如果它发生变化,它会随着该类的每个实例而变化。

  2. 您使用的访问修饰符仅允许用于类级别而不是方法级别。 在您的示例中:

    public static void main(String[] args) {
      Rent r1 = new Rent();
      public static Rent r2; //Will give compile time error.
    }  
    
  3. 考虑到“Static”的目的,如果您在方法内声明静态对象,则其范围将仅绑定到该特定方法。

通常使用静态对象来维护状态。

例如您的数据库连接逻辑可能有一个单例类,并且该类的对象应该保持您的数据库连接状态。 这些对象需要并且必须处于类级别。

【讨论】:

    【解决方案2】:

    您遇到的错误与静态/实例访问无关。由于无效的 Java 语法,它们只是编译时错误。

    您不能使用像 publicstatic 这样的字段修饰符来声明方法内的局部变量(无论是静态方法还是实例方法)。

    只需删除不必要的修饰符:

      public static void main(String[] args) {
          Rent r1 = new Rent();
          Rent r2;
      }
    
      public static Rent r3;
    
      public void def() {
          Rent r4 = new Rent();
          Rent r5;
      }
    

    【讨论】:

      【解决方案3】:

      首先,不允许在方法中使用访问修饰符(public、private、protected)声明变量。您也不应该在方法中将变量声明为static

      您在方法之外声明的那些变量是类的成员。

      有两种类型的变量:

      • 实例变量(非静态成员)
      • 类变量(静态成员)

      我可以看到非静态类的静态对象不能在方法内部创建?

      static 表示它属于该类。它甚至在您实例化对象之前就存在。这就是为什么您可以直接通过类调用静态方法的原因。

      那么什么是静态成员?

      • 静态成员由同一类的所有对象共享。
      • 它甚至在您实例化(创建)对象之前就已经存在。
      • 它属于类,而不是任何单独的对象。

      例子:

      class Pond
      {
          static double waterTemp = 17.5;  //Every Pond object shares the same value
          int numFishes;                   //Belongs to each individual Pond object
      }
      

      如何访问静态成员:

      System.out.println(Pond.waterTemp); //Preferred
      System.out.println(Pond.numFished); //Not allowed
      
      //OR
      
      Pond pond = new Pond();  
      System.out.println(pond.waterTemp); //Not necessary, but allowed
      System.out.println(pond.numFished); //The only way to get numFishes
      

      【讨论】:

        【解决方案4】:

        非静态方法与实例相关联,因此需要先创建实例,然后才能访问它。但是,静态方法与类相关,因此即使没有实例也应该可以使用。这些约束导致静态方法不能在非静态方法中创建。

        【讨论】:

          猜你喜欢
          • 2011-12-08
          • 2011-03-02
          • 2011-11-16
          • 2018-09-20
          • 2011-01-24
          • 2011-07-11
          • 2011-09-16
          • 1970-01-01
          • 2015-11-13
          相关资源
          最近更新 更多