Tech or Treat! Write an article about your scariest tech disaster to win gadgets!Learn more

x
?
Solved

Java: Scopping rules

Posted on 2009-05-15
7
Medium Priority
?
212 Views
Last Modified: 2013-12-29
This is a question about scopping rules.   In the code sample I have purposfully done somthing goofy to as a test.  I expected that line 3, {int b = 3; int c = 4;} ,would result in redefinition of b and c and shadow the variables with the same names in line 2.  Instead it results in the compiler errors shown below.  My question is why is it that the inner scope of line 3 does not allow the variables in line 2 to be redefined?
------------------------------
src\Initializer.java:5: b is already defined in main(java.lang.String[])
                { int b = 3; int c = 4;}
                      ^
src\Initializer.java:5: c is already defined in main(java.lang.String[])
                { int b = 3; int c = 4;}
----------------------------
                                 ^
class Initializer{
 
	public static void main(String [] args){
		int b = 1, c = 2;
		{ int b = 3; int c = 4;}
		System.out.println("Initializer: " + b + " " + c);
	
	}
}

Open in new window

0
Comment
Question by:ssackett
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
  • 2
  • +1
7 Comments
 
LVL 3

Expert Comment

by:emce
ID: 24399481
the {...} by itself doesn't produce a new visibility scope
0
 
LVL 7

Expert Comment

by:zwei
ID: 24399598
emce is right.

For what you want to do you'd have to do something like this:
class Initializer{
        static int b = 1;
        static int c = 2;
 
        public static void main(String [] args){
                int b = 3;
                int c = 4;
                System.out.println("Initializer: " + b + " " + c);
        
        }
}

Open in new window

0
 

Author Comment

by:ssackett
ID: 24399788
emce & Zwei,

Why does the attached code fail to compile?  It seems that the b and c declared inside the initializer can't be seen outside the block (what I would expect) but that the block doesn't behave like a nested scope in other ways.
...
  {int b = 2;}
  b = 1
...

Open in new window

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 17

Expert Comment

by:Thomas4019
ID: 24399921
The point of a custom block decaration { }, is so that variables declared inside can be garbage collected and deleted outside of the block
0
 
LVL 7

Expert Comment

by:zwei
ID: 24400021
The variables are both local variables and are both on the same memory stack within a single method. When you create a new scope, you move on top of the original stack, which is why you can't create a new variable with the same name:
int a = 2;
{int a = 3;} <-- illegal, a is still on the stack.

But when you create a variable within a new scope, when you leave that scope the variable dies which is why this works:

{int b = 2;} <-- b dies here
int  b = 1;
0
 
LVL 17

Accepted Solution

by:
Thomas4019 earned 500 total points
ID: 24400062
According to this link,

http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html

Java throws a compile time error because such naming can lead to very obscure and hard to detect errors.
0
 

Author Closing Comment

by:ssackett
ID: 31582049
Thanks for the help guys.  Yet another reason why it's dangerous to mix C and Java.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

After being asked a question last year, I went into one of my moods where I did some research and code just for the fun and learning of it all.  Subsequently, from this journey, I put together this article on "Range Searching Using Visual Basic.NET …
Introduction Java can be integrated with native programs using an interface called JNI(Java Native Interface). Native programs are programs which can directly run on the processor. JNI is simply a naming and calling convention so that the JVM (Java…
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
Suggested Courses

647 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question