Solved

Java: Scopping rules

Posted on 2009-05-15
7
200 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
  • 2
  • 2
  • 2
  • +1
7 Comments
 
LVL 3

Expert Comment

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

Expert Comment

by:zwei
Comment Utility
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
Comment Utility
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
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 17

Expert Comment

by:Thomas4019
Comment Utility
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
Comment Utility
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 125 total points
Comment Utility
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
Comment Utility
Thanks for the help guys.  Yet another reason why it's dangerous to mix C and Java.
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Suggested Solutions

Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers learn about the third conditional statement “else if” and use it in an example program. Then additional information about conditional statements is provided, covering the topic thoroughly. Viewers learn about the third conditional statement …
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.

772 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

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now