This week's giveaway is in the Android forum.
We're giving away four copies of Android Security Essentials Live Lessons and have Godfrey Nolan on-line!
See this thread for details.
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Hurting My Brains Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Android Security Essentials Live Lessons this week in the Android forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Hurting My Brains" Watch "Hurting My Brains" New topic
Author

Hurting My Brains

Chris Cairns
Ranch Hand

Joined: Jan 31, 2003
Posts: 48
interface I
{
int i = 1, ii = Test.out("ii", 2);
}
interface J extends I
{
int j = Test.out("j", 3), jj = Test.out("jj", 4);
}
interface K extends J
{
int k = Test.out("k", 5);
}
class Test
{
public static void main(String[] args) { System.out.println(K.j); }
public static int out(String s, int i)
{
System.out.println(s + "=" + i);
return i;
}
}
It will print j = 3, jj=4 and then 3.
Could someone explain to me in laymen's terms the reason for the output in the above code. I'm really confused over the difference between compile-time constants and initializations with respect to the above code.
Leandro Oliveira
Ranch Hand

Joined: Nov 07, 2002
Posts: 298
what is initialization of a class??? it is when the class members (specially fields) will be initialized and static initializers will be executed. Some fields (the final compile time constant ones) are inlined by the java compiler, this does not require any class initialization.
final int x=2;
/*2 is a final compile time constant any reference to it will be replaced by value 2*/
final int y=m();
/* this is an example of a final field that isn't a compile time constant the compiler will not inline variable y and if the virtual machine finds any reference to this field, m() will be called once only, it's result will be assigned to y. This is an example of initialization*/

final fields that are compile time constants are inlined at compile time. If you use any final field of any class or instance in your code, the compiler (at compile time, as i said) will replace your reference with the value of the final variable. That's why you have this results while attempting to execute the code from JLS.
Chris Cairns
Ranch Hand

Joined: Jan 31, 2003
Posts: 48
Why is the jj variable printed out?
sharana sharana
Greenhorn

Joined: Mar 14, 2003
Posts: 24
the answer is hidden in the following definition
"A reference to a class field causes initialization of only the class or interface that actually declares it, even though it might be referred to through the name of a subclass, a subinterface, or a class that implements an interface.
"
interface I {
int i = 1, ii = Test.out("ii", 2);
}
interface J extends I {
int j = Test.out("j", 3), jj = Test.out("jj", 4);
}
interface K extends J {
int k = Test.out("k", 5);
}
Class Test {
public static void main(String[] args) {
System.out.println(J.i);
System.out.println(K.j);
}
static int out(String s, int i) {
System.out.println(s + "=" + i);
return i;
}
}

The reference to J.i is to a field that is a compile-time constant; therefore, it does not cause I to be initialized and so i is printed first which is 1. The reference to K.j is a reference to a field actually declared in interface J that is not a compile-time constant; this causes initialization of the fields of interface J and jj so they are printed 3 and 4,
now when k.j is referenced in main j is actually declared in interface j and it already been intialized and hence k.j prints 3 again
hence the output 1,3,4,3


sharana
 
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
 
subject: Hurting My Brains
 
Similar Threads
Interface Q
Question from Enthuware
interface initialization
Interface question
Initialization Related Prob