SCJP java Programmer certification Exam And Training. This site is entirely independent of Sun Microsystems Inc, The Sun Certified Java Programmers Exam (SCJP) is the internationally recognized java certification exam. This site offers free mock Exam preparation questions, practice tests, tutorials, certification faq and sample code. This site contains a very detailed tutorial organized by topic. At the end of the tutorial you can learn from your mistakes and apply your concepts on the free mock exams java certification practice tests.
Chapter 6 - Objects and Classes (Part 4)
// Example 1
public class InnerInnerTest {
public static void main(String s[]) {
new Outer().new Inner().new
InnerInner().new InnerInnerInner().doSomething();
new Outer().new
InnerChild().doSomething();
new Outer2().new
Inner2().new InnerInner2().doSomething();
new InnerChild2().doSomething();
}
}
class Outer {
String name = "Vel";
class Inner {
String name =
"Sharmi";
class InnerInner {
class InnerInnerInner {
public void doSomething() {
// No problem in accessing without full qualification,
// inner-most class variable shadows the outer-most class variable
System.out.println(name); // Prints "Sharmi"
System.out.println(Outer.this.name); // Prints "Vel",
explicit reference to Outer
// error, variable is not
inherited from the outer class, it can be just accessible
//
System.out.println(this.name);
//
System.out.println(InnerInner.this.name);
//
System.out.println(InnerInnerInner.this.name);
// error, super cannot be used
to access outer class.
// super will always refer the
parent, in this case Object
//
System.out.println(super.name);
System.out.println(Inner.this.name); // Prints "Sharmi",
Inner has declared 'name'
}
}
}
}
/* This is an inner class extending an inner class in the
same scope */
class InnerChild extends Inner {
public void doSomething() {
// compiler error, explicit
qualifier needed
// 'name' is inherited from
Inner, Outer's 'name' is also in scope
// System.out.println(name);
System.out.println(Outer.this.name); // prints "Vel",
explicit reference to Outer
System.out.println(super.name); // prints "Sharmi", Inner
has declared 'name'
System.out.println(this.name); // prints "Sharmi", name
is inherited by InnerChild
}
}
}
class Outer2 {
static String name = "Vel";
static class Inner2 {
static String name =
"Sharmi";
class InnerInner2 {
public void doSomething() {
System.out.println(name); // prints "Sharmi", inner-most
hides outer-most
System.out.println(Outer2.name); // prints "Vel",
explicit reference to Outer2's static variable
//
System.out.println(this.name); // error, 'name' is not inherited
//
System.out.println(super.name); // error, super refers to Object
}
}
}
}
/* This is a stand-alone class
extending an inner class */
class InnerChild2 extends
Outer2.Inner2 {
public void doSomething() {
System.out.println(name); // prints "Sharmi", Inner2's
name is inherited
System.out.println(Outer2.name); // prints "Vel",
explicit reference to Outer2's static variable
System.out.println(super.name); // prints "Sharmi",
Inner2 has declared 'name'
System.out.println(this.name); // prints "Sharmi", name
is inherited by InnerChild2
}
}
// Example 2
public class InnerTest2 {
public static void main(String s[]) {
new OuterClass().doSomething(10, 20);
// This is legal
//
OuterClass.InnerClass ic = new OuterClass().new InnerClass();
//
ic.doSomething();
// Compiler error, local inner
classes cannot be accessed from outside
//
OuterClass.LocalInnerClass lic = new OuterClass().new
LocalInnerClass();
//
lic.doSomething();
new OuterClass().doAnonymous();
}
}
class OuterClass {
final int a = 100;
private String secret = "Nothing serious";
public void doSomething(int arg, final int fa) {
final int x = 100;
int y = 200;
System.out.println(this.getClass() + " - in
doSomething");
System.out.print("a = " + a + " secret = " +
secret + " arg = " + arg + " fa = " + fa);
System.out.println("
x = " + x + " y = " + y);
// Compiler error, forward
reference of local inner class
//
new LocalInnerClass().doSomething();
abstract class AncestorLocalInnerClass { } // inner class can be
abstract
final class LocalInnerClass extends AncestorLocalInnerClass { //
can be final
public void doSomething() {
System.out.println(this.getClass() + " - in
doSomething");
System.out.print("a = " + a );
System.out.print(" secret = " + secret);
//
System.out.print(" arg = " + arg); // Compiler error, accessing non-final argument
System.out.print(" fa = " + fa);
System.out.println(" x = " + x);
//
System.out.println(" y = " + y); // Compiler error,
accessing non-final variable
}
}
new InnerClass().doSomething(); // forward reference fine for
member inner class
new LocalInnerClass().doSomething();
}
abstract class AncestorInnerClass { }
interface InnerInterface { final int someConstant = 999;} //
inner interface
class InnerClass extends AncestorInnerClass implements
InnerInterface {
public void doSomething() {
System.out.println(this.getClass() +
" - in doSomething");
System.out.println("a = " +
a + " secret = " + secret + " someConstant = " +
someConstant);
}
}
public void doAnonymous() {
// Anonymous class implementing the inner interface
System.out.println((new InnerInterface() { }).someConstant);
// Anonymous class extending the inner class
( new InnerClass() {
public
void doSomething() {
secret = "secret is changed";
super.doSomething();
}
}
).doSomething();
}
}
Entity |
Declaration
Context |
Accessibility
Modifiers |
Outer
instance |
Direct
Access to enclosing context |
Defines
static or non-static members |
Package level class |
As package member |
Public or default |
No |
N/A |
Both static and non-static |
Top level nested class (static) |
As static class member |
All |
No |
Static members in enclosing context |
Both static and non-static |
Non static inner class |
As non-static class member |
All |
Yes |
All members in enclosing context |
Only non-static |
Local class (non-static) |
In block with non-static context |
None |
Yes |
All members in enclosing context + local final
variables |
Only non-static |
Local class (static) |
In block with static context |
None |
No |
Static members in enclosing context + local final
variables |
Only non-static |
Anonymous class (non-static) |
In block with non-static context |
None |
Yes |
All members in enclosing context + local final
variables |
Only non-static |
Anonymous class (static) |
In block with static context |
None |
No |
Static members in enclosing context + local final
variables |
Only non-static |
Package level interface |
As package member |
Public or default |
No |
N/A |
Static variables and non-static method prototypes |
Top level nested interface (static) |
As static class member |
All |
No |
Static members in enclosing context |
Static variables and non-static method prototypes |
Chapter 6 - Objects and Classes (Part 4)