Re: A small exercise
On 4/27/2013 4:25 AM, lipska the kat wrote:
On 27/04/13 03:13, Arne Vajh?j wrote:
On 4/21/2013 6:04 AM, lipska the kat wrote:
On 20/04/13 20:15, Arne Vajh?j wrote:
On 4/20/2013 12:02 PM, lipska the kat wrote:
On 20/04/13 14:11, Stefan Ram wrote:
Try to predict the behavior of the execution or compilation
of the following code!
public class Main
{ final int a; final int b;
Main(){ this.a = 0; Main.this.b = 0; }
public static void Main( final java.lang.String[] args )
{ new Main(); }}
(I made this observation while programming something else
using Oracle JDK 7, but I have not read the JLS about it yet.)
open-jdk6 and open-jdk7
I think that logically, Main.this.b refers to the enclosing *instance*
which implies that the class has been instantiated, final fields can
only be initialized once in a constructor so trying to (logically)
assign a value to a final variable after instantiation is illegal.
I think :-|
If you remove the final modifier from b then the code compiles, but
then
you know this already.
My understanding of the question is that it is why a work but not b
as this and Main.this should be the same.
Yes, this is what I understood.
I just don't think that >>this<< and >>Main.this<< are logically
equivalent.
>>this<< refers to the current instance,
>>Main.this<< refers to the (logically) enclosing instance which
implies that the >>Main.this.b<< assignment occurs after instantiation
which would be illegal which is why the compiler complains.
For the given code this and Main.this refer to the same object.
Ah yes, the old 'state the obvious to discredit the poster' technique
... weak (and incorrect, see below).
Instead of making incorrect observations try to come up with
a theory of your own. Here's an expansion of my theory
Java-7-openjdk, Eclipse Juno
The following code snippet gives 2 compile time errors
final int a; final int b;
public Main(){
this.a = 0;
Main.this.b = 0;
}
the errors are,
"the blank final field b may not have been initialized"
and
"the final field Main.b cannot be assigned"
This *implies* to me that this.b and Main.this.b are not *logically
equivalent*, this is what I said, nothing to do with whether
"For the given code this and Main.this refer to the same object." that
is entirely a fabrication of your own confused mind, in any case,
Nope.
The JVM agrees.
Try:
System.out.println(this==Main.this);
I
would never have used the work 'object' in this context, I would use the
word instance, not the same thing at all.
You may not have used the term, but since JLS use the term "object
equality", then that is not my problem.
If this and Main.this not equivalent then they must be different, now
all we need to figure out is what the difference is.
The logic that:
the compiler must be correct => different handling by compiler most mean
that they are different => compiler is right
is a circular logic.
I say that the difference is that the construct Main.b *logically*
refers to a concrete instance of Main which implies that Main has been
instantiated which means that you are trying to initialize a blank final
variable outside the class constructor which is illegal.
The exact same logic could just as well be applied to this, so it
does not hold water.
Arne