On Thu, Feb 2, 2023 at 2:16 PM Brian Goetz <[email protected]> wrote:

> This can be amended to:
>
> An explicit constructor invocation statement introduces an
> _pre-initialization context_, which limits the use of constructs that refer
> to the current object.  Notably, the keywords `this` and `super` are
> prohibited in a pre-initialization context, as are unqualified references
> to instance variables and instance methods of lexically enclosing
> declarations.
>

That might not work. For example, this source is legal (as it should be)
and yet the 'this' keyword appears within the super() call:

$ cat Outer.java
public class Outer {

    public int x;

    public Outer(int x) {
        this.x = x;
    }

    public class Inner extends Outer {
        public Inner() {
            super(Outer.this.x + 10);
        }
    }

    public static void main(String[] args) {
        System.out.println(new Outer(10).new Inner().x);
    }
}
$ java -cp classes Outer
20

What about something like this?

An explicit constructor invocation statement introduces a *pre-initialization
> context*, which includes the prologue of the constructor and the explicit
> constructor invocation statement, and which prohibits the use of constructs
> that refer explicitly or implicitly to the current object. These include
> this or super referring to the current object, unqualified references to
> instance variables or instance methods of the current object, method
> references referring to instance methods of the current object, and
> instantiations of inner classes of the current object's class for which the
> current object is the enclosing instance (ยง8.1.3).
>

-Archie

-- 
Archie L. Cobbs

Reply via email to