• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Local Inner Class

 
Ranch Hand
Posts: 130
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I read from somewhere that a class declared inside a method(local inner class) can have final or abstract modifiers. I am sure of final but i don't understand how it can be made abstract. I tried it and it's working fine. Could some body please explain me this. Any thing inside method can only get final modifier right???
 
Ranch Hand
Posts: 1467
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Sree,
A local class inside a method can be abstract OR final. There is nothing wrong in that. But we have to find out what is the use of declaring a local class as abstract and extending the class within the method itself. ANy idea ?
Alkesh ,
We really appreciate your participation here even after you got your SCJP2 certification. Have you finished reading the WeakHashMap part?
A small correction to what you said:
The class which is defined inside the scope of a method can have access ONLY to the final variables of the enclosing method AND ALL of the variables of the enclosing class.
This is not quite true. A class which is defined inside a method can hava access to all final vars inside the same method where it is declared, and all of the variables of the enclosing class WHICH ARE AVAILABLE to the ENCLOSING METHOD
Because an inner class which is defined inside a static method can have access to ONLY STATIC vars of the enclosing class. I am sure you know this. Any way this is the info that all should be aware of. In other words
<pre>

class Outer {
static int staticInt =10;
int instInt = 20;

static void m1() {
class LocalClassInsideStaticMethod {
void m2() {
System.out.println(staticInt); //This is Ok
System.out.println(instInt); //This is NOT Ok
}
}
}
}

</pre>
regds
maha anna
 
sreelakshmi sarma
Ranch Hand
Posts: 130
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks Maha & Alkesh.
Maha i have no idea why we declare a class inside a method as abstract. Could you please explain me.
 
Ranch Hand
Posts: 18944
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Quote ... from Maha Anna's post above :
"...same method where it is declared, and all of the variables of the enclosing class WHICH ARE AVAILABLE to the ENCLOSING METHOD"
In my openion, this should be
"...WHICH ARE AVAILABLE to the ENCLOSING METHOD
and are declared FINAL."
Since there may be a lot more variables "which are available in
the enclosing method". However, the inner classes declared
inside a method can only access FINAL variables (either
declared as local variables in the method or passed to the
method as arguments).
Correct me if I am wrong.
Regds.
- satya
 
maha anna
Ranch Hand
Posts: 1467
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Satya,
What I said was indeed correct. It can access all local-final var and final arg and all var from the enclosing class which are available to the method(both final anf non-final from enclosing class). Here is the evidance. Take a deep breath and look into it. I welcome others also to do some research on this foll code. Since it will DEFINITELY help you understand what is available and what is not available to local inner classes inside a method. I want this code to be of some use for others. I had done the hard-part. Now it's time for you all to play with it.
regds
maha anna

The output is
-------------
var 1 = 1
var 1 = 4
var 1 = 8
var 1 = 9
var 1 = 10
var 1 = 12
var 1 = 14
var 1 = 16
var 1 = 17
var 1 = 18
var 1 = 19
var 1 = 20
var 1 = 21
var 1 = 22
var 1 = 23
var 1 = 24
var 1 = 25

<pre>
class Test {
static int var_1 =1; //outer static var
int var_2 = 2; //outer instance var
final int var_3 =3; //outer instance final var
static final int var_4 =4; //outer class level final var
public int var_5 =5;//outer instance public var
protected int var_6 = 6; //outer instance protected var
private int var_7 = 7; //outer instance private var
static public int var_8 =8;//outer static public var
static protected int var_9 = 9; //outer static protected var
static private int var_10 = 10; //outer static private var

static void m1(int var_11, final int var_12) { // non-final arg, final arg
int var_13=13; //enclosing method's local non-final var
final int var_14 = 14; // enclosing method's local final var
class localClass {
//static int var_15 =10; //local class member can't be static
int var_16=16;
final int var_17=17;
static final int var_18=18; //This is allowed
public int var_19=19;
protected int var_20 = 20;
private int var_21 = 21;
void printAllVariables(int var_22, final int var_23) { //inner class's instance method/final,non-final arg
int var_24=24; //local non-final var
final int var_25=25; //local final var
//Let us check... :-)
System.out.println("var 1 = "+var_1);
//System.out.println("var 1 = "+var_2); //Outer instance var NOT OK
//System.out.println("var 1 = "+var_3); //outer instance final NOT OK
System.out.println("var 1 = "+var_4);
//System.out.println("var 1 = "+var_5);//outer instance public NOT OK
//System.out.println("var 1 = "+var_6);//outer instance protecd NOT OK
//System.out.println("var 1 = "+var_7);//outer instance private NOT OK
System.out.println("var 1 = "+var_8);
System.out.println("var 1 = "+var_9);
System.out.println("var 1 = "+var_10);
//System.out.println("var 1 = "+var_11);//outer enclosing method nonfinal arg NOT OK
System.out.println("var 1 = "+var_12);
//System.out.println("var 1 = "+var_13);//outer enclosing method nonfinal local var NOT OK
System.out.println("var 1 = "+var_14);
//System.out.println("var 1 = "+var_15);
System.out.println("var 1 = "+var_16);
System.out.println("var 1 = "+var_17);
System.out.println("var 1 = "+var_18);
System.out.println("var 1 = "+var_19);
System.out.println("var 1 = "+var_20);
System.out.println("var 1 = "+var_21);
System.out.println("var 1 = "+var_22);
System.out.println("var 1 = "+var_23);
System.out.println("var 1 = "+var_24);
System.out.println("var 1 = "+var_25);
}//end of printAllVariables()
}//end of localclass declaration
new localClass().printAllVariables(22,23);
}//end of m1()
public static void main(String[] args) {
new Test().m1(11,12);
}
}

</pre>

[This message has been edited by maha anna (edited April 17, 2000).]
 
Rancher
Posts: 241
Ubuntu
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I have no good guess on the function of an abstract local inner class. The suspense is killing me!
Also, with regard to the class Outer earlier in the post, is there any way to instantiate the class LocalClassInsideStaticMethod, from an outside class? I tried a few ways but it seems not do-able.
Eric
 
Wanderer
Posts: 18671
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Eric & Sree- I can write an example of an abstract local class, but I can't really come up with any example where it would actually be useful for anything. An abstract class can't really be useful unless you're going to create at least two other classes that implement it - if there's just one, then why bother putting some functionality in the abstract class and some in the concrete subclass? Just put it all in the one class. And the abstract local class is only in scope inside the method it's defined in - so the only place to implement other classes which extend it, is inside the same method. So we're talking about at least three separate local classes inside the same method, in addition to the code that actually uses the classes. Ugh! That's going to be an unreadable nightmare. Methods should be kept short for readability. All those local classes would work much better as top-level classes or member classes, defined somewhere outside the method where they won't create such confusion. If the classes need access to some local variables, then create methods that allow the variable value to be passed.
Actually, I feel much the same about most local classes. Anonymous classes can be OK if they're short, but named local classes take up too much space inside a method. You can use them, but in most cases you probably shouldn't.
Anyway, abstract classes are legal, and local classes are legal, and so abstract local classes are legal because there's no fundamental reason why they should be impossible - they're just undesireable, in my opinion.
As for Eric's second question- no. I don't believe it's ever possible to instantiate any local class from outside the method that defines it, much less outside the class that defines it.
 
maha anna
Ranch Hand
Posts: 1467
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
See, I pulled Jim to come here. Actually I was also wondering what could be the use of method-level-abstract inner classes. I waited for Jim.
regds
maha anna
 
Anonymous
Ranch Hand
Posts: 18944
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Maha:
Thanks for your code. That did clear some mis-concept
(I never had a concept ) that I had about Inner classes
being able to access "all variables" which the method
has access to.
And one other thing ...
keep positing such good stuff
Regds
- satya
 
maha anna
Ranch Hand
Posts: 1467
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Satya,
I am glad atleast one person used this code.
regds
maha anna
 
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Maha,
I got this error when I compiled your code with jdk1.1.6. Please take a look.
Error: Variable var_18 can't be static in Test. 1$localClass. Only members of interfaces and top-level classes can be static.
With jdk1.2.2 abd jdk1.3 it compiled with no error. I am sorry for the confusion. You can remove this message. Thank you.
[This message has been edited by PalaniM (edited May 30, 2000).]
 
maha anna
Ranch Hand
Posts: 1467
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Palani,
I once again compiled and checked. It compiles fine. I am using JDK1.2.2 on WIN98. Which compiler are you using?. Is this the only error you are getting?
regds
maha anna
 
PalaniM
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Maha,
I have typed my reply in my previous message. Thanks.
 
Greenhorn
Posts: 12
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
so.. did anyone in any other thread figure out what a local abstract inner class can be used for?
 
Ranch Hand
Posts: 2120
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Please sree and satya5 read our name policy and change your displayed name accordingly.
Thanks.
 
Sheriff
Posts: 4313
Android IntelliJ IDE Java
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Originally posted by Jose Botella:
Please sree and satya5 read our name policy and change your displayed name accordingly.
Thanks.


--- good effort Jose -- except those two posts are dated April and May of 2000 :roll: -- don't think they'll be changing their names anytime soon...
 
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
It would be strange to provide an abstract inner class within a method; however, placing a class within a method probably makes it invisible even to reflection.
FYI. You can also declare a private class within an interface (except on HP)... Good for enums.
 
Jose Botella
Ranch Hand
Posts: 2120
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator


good effort Jose -- except those two posts are dated April and May of 2000 -- don't think they'll be changing their names anytime soon...


oh come on good will is what counts. I tried, but the dates are just nuances :roll:
No, it is not possible to declare a private class within an interface. All the memebers in an interface are public.
 
reply
    Bookmark Topic Watch Topic
  • New Topic