• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Sharpen your pencil, chapter numbers and statics

 
Sanjana Sharma
Greenhorn
Posts: 29
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hey guys, I had doubt regarding Sharpen you pencil - head first java page 285.
We need to check which of the following would compile or not! I have commented where i feel there might be a problem.

please tell me , if i am right!
And what are the things i need to look for?

Thanks
 
Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15482
43
Android IntelliJ IDE Java Scala Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Welcome to the Ranch! Please UseCodeTags when you post source code, and make sure the indentation is preserved - that way your source code is much easier to read.

1. Right. Non-final member variables (static or not) are initialized to default values if you don't initialize them explicitly. For int the default value is 0, so x will be 0.

2. Correct.

3. Correct - final variables must be initialized explicitly. They are not initialized with default values.

4. Nothing wrong with that.

5. Also no problem. Note that the argument variable (lower-case x) doesn't have anything to do with the member variable upper-case X.

6. This one is wrong. The argument variable x hides the member variable x. The static method is not trying to access the member variable!
 
Sanjana Sharma
Greenhorn
Posts: 29
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thanks, so much for the answers..

Yes, i am new to the forum. i will use the code tags from now on.

So even the last one will compile?
 
Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15482
43
Android IntelliJ IDE Java Scala Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Why don't you just try it out?
 
Sanjana Sharma
Greenhorn
Posts: 29
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Actually i just wanted to have a fair reasoning behind all and then try compiling..

Thanks a lot for your help.
 
Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15482
43
Android IntelliJ IDE Java Scala Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I agree, if you want to learn and test yourself to try to solve it without the computer first, but afterwards you can check if you were right by trying it out.

The last example should just compile normally. The argument variable hides the member variable. So inside the method, x refers to the argument variable, and not the member variable. If you want to access the member variable inside the method, you can prefix it with "this":
 
Sanjana Sharma
Greenhorn
Posts: 29
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Wow, you just made so clear !
Thanks a bunch !
 
Matt Hanrahan
Greenhorn
Posts: 14
Netscape
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I just wanted to say thanks also! #6 was where my question was also. The bottom line I'm picking up here is that a static method's argument variable can "take" or "access" a non-static variable. Did I say that right? Thanks.
 
Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15482
43
Android IntelliJ IDE Java Scala Spring
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Matt Hanrahan wrote:... a static method's argument variable can "take" or "access" a non-static variable. Did I say that right? Thanks.

Not really... when you have a method with an argument that has the same name as a member variable, then inside the method, the argument is used instead of the member variable. So, the argument hides the member variable:

This doesn't really have anything to do with whether the method is static or not. A static method can never access non-static member variables.

Note: I made a mistake in my post above from 20 February. You can't use "this.x" in a static method, because "this" (the object that the method is being called on) doesn't exist in a static method.

And welcome to the Ranch!
 
Matt Hanrahan
Greenhorn
Posts: 14
Netscape
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thank you for the help.



So in this case inside the method the print statement gets "x" from the argument and the argument gets "x" from the member?
 
Jitendra Jha
Ranch Hand
Posts: 92
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
So in this case inside the method the print statement gets "x" from the argument and the argument gets "x" from the member?


Not exactly.

'x' in the argument takes its value from the calling code as shown. It is an extended example of shadowing where the argument variable shadows the member variable.


 
Matt Hanrahan
Greenhorn
Posts: 14
Netscape
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Awesome and thank you. I was still not getting it exactly so I added a a main and tried to run the code.
I'm adding the two samples for anyone who has this same question as an example.
Let me know if I got anything wrong, but I think this helps to illustrate the point (which I think is an important one).

This code:

Will compile and output:
19

This code:

will not compile.

The compiler returns; "non-static variable x cannot be referenced from a static context"

Thanks again for the help!
 
Jitendra Jha
Ranch Hand
Posts: 92
  • Likes 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
The code on line five(5) works because, you are trying to print an argument variable which has scope and priority inside the method.
But the code on line 10 fails to compile because it is trying to use the variable on line 2 which is non static and hence cannot be referenced from the static context(main method).
 
Matt Hanrahan
Greenhorn
Posts: 14
Netscape
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Indeed! And thanks for the quick reply and help!
 
Nikhil Kadi
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
hello all java loves, just joined the forum. I am reading head first java and reached this exercise everyone is taking about.

I don't understand in 3rd code I.e foo3, if final variables need to be assigned explicitly, how is it correct and if correct what will be the output. thanks. will be visiting often.
 
Ashish Dutt
Ranch Hand
Posts: 172
Java MySQL Database Python
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hello Nikhil,
Welcome to Java Ranch.
In class Foo3 if there was no final keyword then it would have compiled.
The final keyword states that the variable cannot be assigned any other value later.. Its like the gospel truth, cant change the variable value at all.
Now if you dont initialise the variable declared as final, JVM is surely going to cry foul play.
Hope this reasoning helps
 
Nikhil Kadi
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
thanks a lot for the quick reply. it removes my confusion. it's just that it was answered correct in a previously reply, probably by mistake, which confused me. thanks a lot again.
 
Daniel Sung
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Can someone please show me how I can test these out? I'm having trouble doing it with Eclipse right now.. Thanks
 
fred rosenberger
lowercase baba
Bartender
Posts: 12196
35
Chrome Java Linux
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Daniel Sung wrote:Can someone please show me how I can test these out? I'm having trouble doing it with Eclipse right now.. Thanks

Compile from the command line.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic