Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / May 2007

Tip: Looking for answers? Try searching our database.

explain this pls

Thread view: 
lurer@gmx.net - 30 May 2007 13:11 GMT
class Out
{
      int x;
       {
               k = 5; //valid
               x = k; //invalid
       }
       public int k;
}
Jussi Piitulainen - 30 May 2007 13:27 GMT
Out.java:6: illegal forward reference
       x = k; //invalid
           ^
1 error
lurer@gmx.net - 30 May 2007 13:42 GMT
On May 30, 2:27 pm, Jussi Piitulainen <jpiit...@ling.helsinki.fi>
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

?
Jussi Piitulainen - 30 May 2007 16:44 GMT
>> Out.java:6: illegal forward reference
>>         x = k; //invalid
[quoted text clipped - 7 lines]
>
> ?

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".
Joshua Cranmer - 30 May 2007 22:06 GMT
>>> Out.java:6: illegal forward reference
>>>         x = k; //invalid
[quoted text clipped - 10 lines]
> 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.
Lew - 30 May 2007 22:28 GMT
>>>> Out.java:6: illegal forward reference
>>>>         x = k; //invalid
[quoted text clipped - 27 lines]
> 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:
>
[quoted text clipped - 4 lines]
>
> 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.

Signature

Lew

Lew - 30 May 2007 22:11 GMT
>>> Out.java:6: illegal forward reference
>>>         x = k; //invalid
[quoted text clipped - 10 lines]
> 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:
>
[quoted text clipped - 3 lines]
>     * 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.

Signature

Lew



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.