This is based on the description of http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
and I have enclosed a example project to show some syntax and features related to the Nested Class.
In a short word, "the Java Programming Language allows you to define a classs within another class, such a class is called a nested class and .."
Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static
are simply called static nested classes. Non-static nested classes are called inner classes.
package com.boqwang.innner;
public class InnerClassTest {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner1 = createInnerClass(outer);
OuterClass.InnerClass inner2 = createInnerClass(outer);
OuterClass.InnerClass inner3 = outer.createInnerClass();
boolean error = false;
if (inner1.getOuterClass() != outer) {
System.out.println("Error!");
error = true;
}
if (inner2.getOuterClass() != outer) {
System.out.println("Error!");
error = true;
}
if (inner3.getOuterClass() != outer) {
System.out.println("Error!");
error = true;
}
if (inner1.getThis() != inner2.getThis()
&& inner1.getThis() != inner2.getThis()
&& inner2.getThis() != inner3.getThis()) {
System.out.println("Innner instances created by the same outer instance are different");
}
if (!error) {
System.out.println("All inner instance created by the same outer class have the same reference to outer instance");
}
}
/**
* Create a Innert class instance
* @param outerObject
* @return inner class instance
* It is required to have an outer class instance in order to create an inner class instance
*/
public static OuterClass.InnerClass createInnerClass(OuterClass outerObject) {
return outerObject.new InnerClass();
}
}
class OuterClass {
private int outerClassField = 1;
private static int outerStaticClassField = 2;
class InnerClass {
public int getOutClassField() {
return OuterClass.this.outerClassField;
}
public OuterClass getOuterClass() {
return OuterClass.this;
}
public InnerClass getThis() {
return this;
}
}
public InnerClass createInnerClass() {
return new InnerClass();
}
static class NestedClass {
public int getOuterClassStaticField() {
return OuterClass.outerStaticClassField;
}
// Nested static Class could not access outer class's instance field
// because the Nested Class does not have the OuterClass.this pointer
// public int getOuterClassField() {
// return OuterClass.this.outerClassField;
// }
// Nested static class does not have "this" pointer because it
// it is a static class
// public NestedClass getThis() {
// return this;
// }
// Nested static Class Does not have "Outer.this" pointer
// because it is static
// public OuterClass getThis() {
// return OuterClass.this;
// }
}
}
So in a nutshell,
An instance of InnerClass
can exist only within an instance of OuterClass
and has direct access to the methods and fields of its enclosing instance. The next figure illustrates this idea.
An Instance of InnerClass Exists Within an Instance of OuterClass
分享到:
相关推荐
Java 面试题 经典 第一,谈谈final, finally, finalize的区别。...第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)
Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别,HashMap 和 Hashtable 的区别,...
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass(); ``` ##### 2.2 内部类 - **定义**:未被`static`关键字修饰的类被称为内部类。 - **特点**: - 必须依赖于外部类的实例存在...
在上面的例子中,`StaticNestedClass`可以直接访问`OuterClass`的静态成员`str_2`,并通过持有`OuterClass`的实例引用`outer`来访问实例成员`str_1`及实例方法`print_instance()`。 #### 三、非静态嵌套类(内部类...
可以通过"OuterClass.InnerClass"的方式引用静态成员类,如`new Outer.Inner1()`。 6. **使用场景** - 当需要创建一个与外部类紧密相关的辅助类,并且希望这个类在没有外部类实例的情况下也能存在时,可以使用...
本文将对 Java 面试题进行详解,涵盖 final、finally、finalize、Anonymous Inner Class、Static Nested Class、Inner Class、& 和&&、HashMap 和 Hashtable、Collection 和 Collections 等知识点。 一...
本文将详细解释JAVA程序员面试中的32个问题,涵盖final、finally、finalize的区别、Anonymous Inner Class、Static Nested Class、HashMap和Hashtable的区别、Collection和Collections的区别、断言的使用、GC的概念...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 这个问得很少。 第五,HashMap和Hashtable的区别。 常问。 第六,Collection 和 ...
在Java中,还有Static Nested Class和Inner Class的概念。Static Nested Class意味着创建一个static内部类的对象,不需要一个外部类对象,不能从一个static内部类的一个对象访问一个外部类对象。 在Java面试中,还...
Java面试笔试题集是Java开发者面试过程中的重要参考资料,本文将对Java中的异常处理机制、垃圾回收机制、Error与Exception的区别、final、finally、finalize的区别、Anonymous Inner Class、static Nested Class与...
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass(); ``` 总结起来,Inner Class和Static Nested Class的主要区别在于: 1. **依赖性**:Inner Class实例化需要外部类的实例;而Static ...
final—修饰符 Anonymous Inner Class Static Nested Class 和 Inner Class的不同
3. Static Nested Class 和 Inner Class 的不同 Inner Class 是一个内部类,需要外部类对象来访问,而 Static Nested Class 不需要外部类对象。Inner Class 可以访问外部类对象的成员变量,而 Static Nested Class...
OuterClass.InnerClass inner = outer.new InnerClass();` 4. **作用场景**: - 静态内部类常用于封装与外部类相关联的工具类或辅助类,这些类不依赖于外部类的实例状态,而是与外部类的类级别信息有关。 - 非...
内部类有两种形式:静态内部类(Static Nested Class)和非静态内部类(Non-static Nested Class)。 - **非静态内部类**:非静态内部类需要一个外部类的对象来实例化,它可以直接访问外部类的非静态成员。这种...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 第四,&和&&的区别。 第五,HashMap和Hashtable的区别。 第六,Collection 和 Collections的区别。 第七,什么时候...
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类...