嵌套类是指被定义在另一个类内部的类。
嵌套类(nested class)是指被定义在另一个类内部的类。嵌套类的存在目的应该只是为外围类(enclosing class)提供服务。嵌套类有四种:
除了第一种外,其他三种都被成为内部类(inner class)。静态嵌套类, 就是用static修饰的成员嵌套类。InnerClass,也就是没有用static定义的nested classes,Inner Classes 不能定义为static,不能有static方法和static初始化语句块
OuterStaticInnerClass.PublicInnerCLass publisInnerCLass = new OuterStaticInnerClass.PublicInnerCLass();
public class OuterStaticInnerClass {
private String teacher;
private static int grade;//年级
private static String className;//班级名称
public OuterStaticInnerClass() {
this.grade = 1;
this.className = "高三";
this.teacher="王莉";
}
public void outerPrint() {
System.out.println("OuterStaticInnerClass.outerPrint");
System.out.println(className + grade + "班的老师是:" + teacher);
}
public static class PublicInnerCLass {
private int age;//年龄
private String name;//名字
//构造方法
public PublicInnerCLass() {
}
public PublicInnerCLass(int age, String name) {
this.age = age;
this.name = name;
}
public String print() {
//静态类可以访问外围类的成员
new OuterStaticInnerClass().outerPrint();
System.out.println("OuterStaticInnerClass:PublicInnerCLass");
return name + " 年龄:" + age + ",班级:" + className + Integer.toString(grade)+"班,老师:"+new OuterStaticInnerClass().teacher;
}
}
private static class PrivateInnerCLass {
private int age;//年龄
private String name;//名字
public PrivateInnerCLass() {
}
public PrivateInnerCLass(int age, String name) {
this.age = age;
this.name = name;
}
public void print() {
System.out.println("OuterStaticInnerClass:PrivateInnerCLass");
System.out.println(name + " 年龄:" + age + ",班级:" + className + Integer.toString(grade) + "班,老师:" + new OuterStaticInnerClass().teacher);
}
}
}
/** * 静态成员类 */
public static void outerStaticInnerClassTest() {
OuterStaticInnerClass outerStaticInnerClass = new OuterStaticInnerClass();
//静态成员类实例化
OuterStaticInnerClass.PublicInnerCLass publisInnerCLass = new OuterStaticInnerClass.PublicInnerCLass(18, "lis");
//chapter4.item22.OuterStaticInnerClass.PrivateInnerCLass' has private access in 'chapter4.item22.OuterStaticInnerClass
//如果静态成员类是私有的,只能在外围类的内部才能访问
//OuterStaticInnerClass.PrivateInnerCLass privateInnerCLass=new OuterStaticInnerClass.PrivateInnerCLass();
System.out.println(publisInnerCLass.print());
}
public class OuterNonStaticInnerClass {
private String teacher;
private static int grade;//年级
private static String className;//班级名称
public OuterNonStaticInnerClass() {
this.grade = 1;
this.className = "高三";
this.teacher = "王莉";
}
public void outerPrint() {
System.out.println("OuterNonStaticInnerClass.outerPrint");
System.out.println(className + grade + "班的老师是:" + teacher);
}
public class PublicInnerCLass {
private int age;//年龄
private String name;//名字
//构造方法
public PublicInnerCLass() {
}
public PublicInnerCLass(int age, String name) {
this.age = age;
this.name = name;
}
public String print() {
// 非静态成员类的实例方法内部可以调用外围实例的方法和变量。
outerPrint();
System.out.println("OuterStaticInnerClass:PublicInnerCLass");
return name + " 年龄:" + age + ",班级:" + className + Integer.toString(grade) + "班,老师:" + teacher;
}
}
private class PrivateInnerCLass {
private int age;//年龄
private String name;//名字
public PrivateInnerCLass() {
}
public PrivateInnerCLass(int age, String name) {
this.age = age;
this.name = name;
}
public void print() {
System.out.println("OuterStaticInnerClass:PrivateInnerCLass");
System.out.println(name + " 年龄:" + age + ",班级:" + className + Integer.toString(grade) + "班,老师:" + teacher);
}
}
}
public static void outerNonStaticInnerClassTest(){
//类内部实例化
// 非静态成员类的实例方法内部可以调用外围实例的方法。
//在没有外围实例的情况下,创建非静态成员类的实例是不可能的。
//非静态成员类的每个实例都隐含着与外围类的一个外围实例相关联。
OuterNonStaticInnerClass outerClass = new OuterNonStaticInnerClass();
//chapter4.item22.OuterNonStaticInnerClass.PrivateInnerCLass' has private access in 'chapter4.item22.OuterNonStaticInnerClass
//OuterNonStaticInnerClass.PrivateInnerCLass privateInnerCLass = outerClass.new PrivateInnerCLass();
//privateInnerCLass.print();
OuterNonStaticInnerClass.PublicInnerCLass publicInnerCLass = outerClass.new PublicInnerCLass(18, "lis");
System.out.println(publicInnerCLass.print());
}
public interface OuterAnonymousInnerInter {
public void print(int age, String name);
}
public abstract class OuterAnonymousInnerClass {
//成员方法
public abstract void innerMethod(int age, String name);
}
public static void outerAnonymousInnerInterTest() {
OuterAnonymousInnerInter innerInter = new OuterAnonymousInnerInter() {
private String teacher = "王莉";
@Override
public void print(int age, String name) {
System.out.println("OuterAnonymousInnerInter anonymous inner class");
System.out.println(name + " 年龄:" + age + "老师:" + teacher);
}
};
innerInter.print(18, "lis");
OuterAnonymousInnerClass outerClass = new OuterAnonymousInnerClass() {
private String teacher = "王莉";
@Override
public void innerMethod(int age, String name) {
System.out.println("OuterAnonymousInnerClass innerMethod");
System.out.println(name + " 年龄:" + age + "老师:" + teacher);
}
};
outerClass.innerMethod(18, "lis");
}
public class OuterLocalInnerClass {
private String teacher;//老师
private static int grade;//年级
private static String className;//班级名称
public OuterLocalInnerClass() {
this.grade = 1;
this.className = "高三";
this.teacher = "王莉";
}
//局部类
public void innerMethod() {
class InnerCLass3 {
private int age;//年龄
private String name;//名字
public InnerCLass3(int age, String name) {
this.age = age;
this.name = name;
}
}
InnerCLass3 innerCLass3=new InnerCLass3(18, "lis");
System.out.println(innerCLass3.name + " 年龄:" + innerCLass3.age);
System.out.println(className + grade + "班的老师是:" + teacher);
}
}
public static void outerLocalInnerClassTest(){
OuterLocalInnerClass outerClass=new OuterLocalInnerClass();
outerClass.innerMethod();
}
lis 年龄:18
高三1班的老师是:王莉