当前位置: 代码迷 >> java >> 为什么不能在方法内部创建非静态类的静态对象?
  详细解决方案

为什么不能在方法内部创建非静态类的静态对象?

热度:23   发布时间:2023-07-31 11:04:25.0

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

码:

  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
      }
  }

您必须考虑以下几点:

  1. 静态数据类似于静态方法 它与实例无关。 声明为静态的值没有关联的实例。 它在每个实例中都存在,并且仅在内存中的单个位置声明。 如果曾经更改过,它将针对该类的每个实例进行更改。

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

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

通常,静态对象用于维护状态。

例如,您的数据库连接逻辑可能具有一个singleton类,并且此类的对象应保持数据库连接状态 这些对象必须是并且必须在类级别。

您得到的错误与静态/实例访问无关。 由于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;
  }

首先,不允许您在方法内使用访问修饰符(公共,私有,受保护)声明变量。 您也不应在方法中将变量声明为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

非静态方法与实例相关联,因此需要先创建一个实例,然后才能对其进行访问。 但是,静态方法与类有关,因此即使没有实例也不应使用。 这些约束导致无法在非静态方法内部创建静态方法。

  相关解决方案