Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > explain this pls

Reply
Thread Tools

explain this pls

 
 
lurer@gmx.net
Guest
Posts: n/a
 
      05-30-2007
class Out
{
int x;
{
k = 5; //valid
x = k; //invalid
}
public int k;
}

 
Reply With Quote
 
 
 
 
Jussi Piitulainen
Guest
Posts: n/a
 
      05-30-2007
Out.java:6: illegal forward reference
x = k; //invalid
^
1 error
 
Reply With Quote
 
 
 
 
lurer@gmx.net
Guest
Posts: n/a
 
      05-30-2007
On May 30, 2:27 pm, Jussi Piitulainen <(E-Mail Removed)>
wrote:
> Out.java:6: illegal forward reference
> x = k; //invalid
> ^
> 1 error


so "forward assignment" is ok?

k = 5; //"forward assignment"
x = k; //compiler error because of forward reference

?






 
Reply With Quote
 
Jussi Piitulainen
Guest
Posts: n/a
 
      05-30-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) writes:
> Jussi Piitulainen wrote:
>> Out.java:6: illegal forward reference
>> x = k; //invalid
>> ^
>> 1 error

>
> so "forward assignment" is ok?
>
> k = 5; //"forward assignment"
> x = k; //compiler error because of forward reference
>
> ?


Seems so. A simplest web search suggests that the JLS, possibly in
section 8.3.2, requires declaration before using a variable in an
initializer "not on the left hand side of an assignment".
 
Reply With Quote
 
Joshua Cranmer
Guest
Posts: n/a
 
      05-30-2007
Jussi Piitulainen wrote:
> (E-Mail Removed) writes:
>> Jussi Piitulainen wrote:
>>> Out.java:6: illegal forward reference
>>> x = k; //invalid
>>> ^
>>> 1 error

>> so "forward assignment" is ok?
>>
>> k = 5; //"forward assignment"
>> x = k; //compiler error because of forward reference
>>
>> ?

>
> Seems so. A simplest web search suggests that the JLS, possibly in
> section 8.3.2, requires declaration before using a variable in an
> initializer "not on the left hand side of an assignment".


I suppose that makes sense.

k = 5; is correct because the assignment of k works, but if x=k; were
allowed, this could happen:

int x;
{
x = k;
}
int k = x;

What is x and k? k is defined initially in terms of x, which is
initialized to k, so no definite assignment can be given them.

In short, forward assignment is harmless, so it is allowed; forward
reference opens up a can of worms, so it is forbidden.
 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      05-30-2007
Jussi Piitulainen wrote:
> (E-Mail Removed) writes:
>> Jussi Piitulainen wrote:
>>> Out.java:6: illegal forward reference
>>> x = k; //invalid
>>> ^
>>> 1 error

>> so "forward assignment" is ok?
>>
>> k = 5; //"forward assignment"
>> x = k; //compiler error because of forward reference
>>
>> ?

>
> Seems so. A simplest web search suggests that the JLS, possibly in
> section 8.3.2, requires declaration before using a variable in an
> initializer "not on the left hand side of an assignment".


Skipping the web search and going straight to
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.2>
we find
> Use of class variables whose declarations appear textually after the use is sometimes restricted, even though these class variables are in scope. See §8.3.2.3 for the precise rules governing forward reference to class variables.


Going in turn to
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#287406>
we find:
> The declaration of a member needs to appear textually before it is used only if the member is an instance (respectively static) field of a class or interface C and all of the following conditions hold:
>
> * The usage occurs in an instance (respectively static) variable initializer of C or in an instance (respectively static) initializer of C.
> * The usage is not on the left hand side of an assignment.
> * The usage is via a simple name.
> * C is the innermost class or interface enclosing the usage.
> A compile-time error occurs if any of the four requirements above are not met.


That last phrase I think is a typo; I interpret it to mean "A compile-time
error occurs if all of the four requirements above are met and the variable is
referred to before declaration."

That the block is an instance initializer is clear from
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6>
which repeats
> Use of instance variables whose declarations appear textually after the use is sometimes restricted, even though these instance variables are in scope. See §8.3.2.3 for the precise rules governing forward reference to instance variables.


Reading the JLS is a useful way to resolve syntax questions.

--
Lew
 
Reply With Quote
 
Lew
Guest
Posts: n/a
 
      05-30-2007
Joshua Cranmer wrote:
> Jussi Piitulainen wrote:
>> (E-Mail Removed) writes:
>>> Jussi Piitulainen wrote:
>>>> Out.java:6: illegal forward reference
>>>> x = k; //invalid
>>>> ^
>>>> 1 error
>>> so "forward assignment" is ok?
>>>
>>> k = 5; //"forward assignment"
>>> x = k; //compiler error because of forward reference
>>>
>>> ?

>>
>> Seems so. A simplest web search suggests that the JLS, possibly in
>> section 8.3.2, requires declaration before using a variable in an
>> initializer "not on the left hand side of an assignment".

>
> I suppose that makes sense.
>
> k = 5; is correct because the assignment of k works, but if x=k; were
> allowed, this could happen:
>
> int x;
> {
> x = k;
> }
> int k = x;
>
> What is x and k? k is defined initially in terms of x, which is
> initialized to k, so no definite assignment can be given them.
>
> In short, forward assignment is harmless, so it is allowed; forward
> reference opens up a can of worms, so it is forbidden.


Skipping the web search and going straight to the JLS we find:
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.3.2>
> Use of class variables whose declarations appear textually after the use is sometimes restricted, even though these class variables are in scope. See §8.3.2.3 for the precise rules governing forward reference to class variables.


and
> The declaration of a member needs to appear textually before it is used only if the member is an instance (respectively static) field of a class or interface C and all of the following conditions hold:
>
> * The usage occurs in an instance (respectively static) variable initializer of C or in an instance (respectively static) initializer of C.
> * The usage is not on the left hand side of an assignment.
> * The usage is via a simple name.
> * C is the innermost class or interface enclosing the usage.
>
> A compile-time error occurs if any of the four requirements above are not met.


I interpret that last sentence to implicitly include "and the usage is a
forward reference."

Instance initializers are covered in:
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6>
which repeats:
> Use of instance variables whose declarations appear textually after the use is sometimes restricted, even though these instance variables are in scope. See §8.3.2.3 for the precise rules governing forward reference to instance variables.


The JLS can be very useful in resolving Java syntax or semantics questions.

--
Lew
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Intetesting is up! Pls explain Helen... Helen Digital Photography 17 09-12-2009 09:50 PM
Re: [SI] Intetesting is up! Pls explain Helen... an apology. tony cooper Digital Photography 2 09-11-2009 02:44 AM
pls explain this macro Ravi C Programming 4 07-18-2007 09:48 AM
Can anybody explain this code pls? roohbir Javascript 2 10-23-2006 08:02 AM
pls, help.. i need a number..pls olabanji timothy MCSE 7 09-10-2003 04:02 PM



Advertisments