Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4459133

Forward reference legal or illegal?

    Details

    • Subcomponent:
    • Resolved In Build:
      hopper
    • CPU:
      x86
    • OS:
      windows_98
    • Verification:
      Verified

      Description



      Name: bsC130419 Date: 05/15/2001


      java version "1.3.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-C)
      Java HotSpot(TM) Client VM (build 1.3.0-C, mixed mode)

      Please refer to JLS section 8.3.2.3(Restrictions on the use of fields during
      initialization).Here a class UseBeforeDeclaration has been defined showing that
      sometimes a forward reference is okay( variable x in the very first line)in a
      static block as long as it is assignment only.

      But the code does not compile even after commenting out the lined marked as
      erroneous.The compiler says illegal forward reference.Here is the code...
      class UseBeforeDeclaration {
      static {
      x = 100; // ok - assignment
      int y = x + 1; // error - read before declaration
      int v = x = 3; // ok - x at left hand side of assignment
      int z = UseBeforeDeclaration.x * 2;
      // ok - not accessed via simple name
      Object o = new Object(){
      void foo(){x++;} // ok - occurs in a different class
      {x++;} // ok - occurs in a different class
           };
        }
      {
      j = 200; // ok - assignment
      j = j + 1; // error - right hand side reads before declaration
      int k = j = j + 1;
      int n = j = 300; // ok - j at left hand side of assignment
      int h = j++; // error - read before declaration
      int l = this.j * 3; // ok - not accessed via simple name
      Object o = new Object(){
      void foo(){j++;} // ok - occurs in a different class
      { j = j + 1;} // ok - occurs in a different class
      };
      }
      int w = x= 3; // ok - x at left hand side of assignment
      int p = x; // ok - instance initializers may access static fields
      static int u = (new Object(){int bar(){return x;}}).bar();
      // ok - occurs in a different class
      static int x;
      int m = j = 4; // ok - j at left hand side of assignment
      int o = (new Object(){int bar(){return j;}}).bar();
      // ok - occurs in a different class
      int j;
      }
      (Review ID: 124284)
      ======================================================================

        Attachments

          Activity

            People

            • Assignee:
              gafter Neal Gafter
              Reporter:
              bstrathesunw Bill Strathearn (Inactive)
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:
                Imported:
                Indexed: