内部类——静态内部类

来源:互联网 发布:浙江省嘉兴市行知小学 编辑:程序博客网 时间:2024/05/17 21:38

静态内部类属于外部类本身,而不是属于外部类的对象。 

使用静态内部类时无需创建外部类的对象。



一、静态内部类里可以定义什么、不可以定义什么 

静态内部类中可以定义任何成员:初始化块(静态、非静态)、成员变量(静态、非静态)、成员方法(静态、非静态)

示例代码:

package org.lgy.study.innerclass;/* javac -d classes "src/org/lgy/study/innerclass/StaticInnerClass.java"java org.lgy.study.innerclass.StaticInnerClass */public class StaticInnerClass{private static class InnerClass{// 静态内部类中可以定义静态初始化块static{System.out.println("inner class : static initialize block");}// 静态内部类中可以定义普通初始化块{System.out.println("inner class : nonstatic initialise block");}// 静态内部类中可以定义静态成员变量private static String staticField = "inner class : static field";// 静态内部类中可以定义非静态成员变量private String nonStaticField = "inner class : nonstatic field";// 静态内部类中可以定义静态成员方法public static void staticMethod(){System.out.println("inner class : static method");}// 静态内部类中可以定义非静态成员方法public void nonStaticMethod(){System.out.println("inner class : nonstatic method");}}public static void main(String[] args){sop(StaticInnerClass.InnerClass.staticField);StaticInnerClass.InnerClass.staticMethod();StaticInnerClass.InnerClass innerClass = new StaticInnerClass.InnerClass();sop(innerClass.nonStaticField);innerClass.nonStaticMethod();}private static void sop(Object obj){System.out.println(obj);}}/* inner class : static initialize blockinner class : static fieldinner class : static methodinner class : nonstatic initialise blockinner class : nonstatic fieldinner class : nonstatic method */

二、外部类访问内部类

因为静态内部类属于外部类本身,而不是属于外部类对象;所以当外部类被加载并初始化后,其静态内部类也被加载并初始化了;所以在外部类的静态成员和非静态成员中都可以使用静态内部类。

当在外部类中使用静态内部类时,必须使用类名作为调用者来访问其静态成员,必须使用静态内部类对象作为调用者来访问其实例成员。

外部类可以自由方法内部类的私有成员,而无视其访问权限。内部类的成员的访问权限只对除外部类以外的其他类才有效。

示例代码:

package org.lgy.study.innerclass;/* javac -d classes "src/org/lgy/study/innerclass/StaticInnerClass.java"java org.lgy.study.innerclass.StaticInnerClass */public class StaticInnerClass{// 在外部类的静态初始化块中使用静态内部类static{sop("outer class : static initialize block");sop(StaticInnerClass.InnerClass.staticField);StaticInnerClass.InnerClass.staticMethod();StaticInnerClass.InnerClass innerClass = new StaticInnerClass.InnerClass();sop(innerClass.nonStaticField);innerClass.nonStaticMethod();sop("--------------------------------" + "\n");}// 在外部类的非静态初始化块中使用静态内部类{sop("outer class : nonstatic initialize block");sop(StaticInnerClass.InnerClass.staticField);StaticInnerClass.InnerClass.staticMethod();StaticInnerClass.InnerClass innerClass = new StaticInnerClass.InnerClass();sop(innerClass.nonStaticField);innerClass.nonStaticMethod();sop("--------------------------------" + "\n");}// 使用静态内部类定义静态成员变量private static InnerClass staticField = new InnerClass();// 使用静态内部类定义非静态成员变量private InnerClass nonStaticField = new InnerClass();// 在外部类的静态成员方法中使用静态内部类public static void staticMethod(){sop("outer class : static method");sop(StaticInnerClass.InnerClass.staticField);StaticInnerClass.InnerClass.staticMethod();StaticInnerClass.InnerClass innerClass = new StaticInnerClass.InnerClass();sop(innerClass.nonStaticField);innerClass.nonStaticMethod();sop("--------------------------------" + "\n");}// 在外部类的非静态成员方法中使用静态内部类public void nonStaticMethod(){sop("outer class : nonstatic method");sop(StaticInnerClass.InnerClass.staticField);StaticInnerClass.InnerClass.staticMethod();StaticInnerClass.InnerClass innerClass = new StaticInnerClass.InnerClass();sop(innerClass.nonStaticField);innerClass.nonStaticMethod();sop("--------------------------------" + "\n");}private static class InnerClass{// 静态内部类中可以定义静态初始化块static{System.out.println("inner class : static initialize block");}// 静态内部类中可以定义普通初始化块{System.out.println("inner class : nonstatic initialise block");}// 静态内部类中可以定义静态成员变量private static String staticField = "inner class : static field";// 静态内部类中可以定义非静态成员变量private String nonStaticField = "inner class : nonstatic field";// 静态内部类中可以定义静态成员方法public static void staticMethod(){System.out.println("inner class : static method");}// 静态内部类中可以定义非静态成员方法public void nonStaticMethod(){System.out.println("inner class : nonstatic method");}}public static void main(String[] args){// 调用外部类的静态成员变量的非静态成员方法StaticInnerClass.staticField.nonStaticMethod();// 调用外部类的静态成员方法StaticInnerClass.staticMethod();// 创建外部类的实例StaticInnerClass outerClass = new StaticInnerClass();// 调用外部类实例的非静态成员变量的非静态成员方法outerClass.nonStaticField.nonStaticMethod();// 调用外部类实例的非静态成员方法outerClass.nonStaticMethod();}private static void sop(Object obj){System.out.println(obj);}}/* outer class : static initialize blockinner class : static initialize blockinner class : static fieldinner class : static methodinner class : nonstatic initialise blockinner class : nonstatic fieldinner class : nonstatic method--------------------------------inner class : nonstatic initialise blockinner class : nonstatic methodouter class : static methodinner class : static fieldinner class : static methodinner class : nonstatic initialise blockinner class : nonstatic fieldinner class : nonstatic method--------------------------------outer class : nonstatic initialize blockinner class : static fieldinner class : static methodinner class : nonstatic initialise blockinner class : nonstatic fieldinner class : nonstatic method--------------------------------inner class : nonstatic initialise blockinner class : nonstatic methodouter class : nonstatic methodinner class : static fieldinner class : static methodinner class : nonstatic initialise blockinner class : nonstatic fieldinner class : nonstatic method-------------------------------- */

三、内部类访问外部类

因为静态内部类属于外部类本身,而不属于外部类的对象,使用静态内部类时无需创建外部类的对象;

所以静态内部类不能访问外部类的实例成员,只能访问外部类的类成员;即使是静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的类成员。

如果想要在静态内部类中访问外部类的实例成员,则必须显示创建外部类的实例,然后通过外部类的实例来访问其实例成员。

外部类的成员的访问权限对内部类是无效的,也就是说,如果内部类可以访问到外部类的某个成员(静态的)即使该成员是私有的,内部类依然可以访问到。

示例代码:

package org.lgy.study.innerclass;/* javac -d classes "src/org/lgy/study/innerclass/StaticInnerClass.java"java org.lgy.study.innerclass.StaticInnerClass */public class StaticInnerClass{private static String staticField = "outer class : static field";private String nonStaticField = "outer class : nonstatic field";public static void staticMethod(){sop("outer class : static method");}public void nonStaticMethod(){sop("outer class : nonstatic method");}private static class InnerClass{static{System.out.println("inner class : static initialize block");// 可以在静态内部类的静态初始化块中访问外部类的静态成员System.out.println(StaticInnerClass.staticField); // 静态成员变量StaticInnerClass.staticMethod(); // 静态成员方法// 不可以在静态内部类的静态初始化块中访问外部类的非静态成员/* System.out.println(nonStaticField);StaticInnerClass.this.nonStaticMethod(); */// 可以通过创建外部类实例的方式来访问外部类的实例成员StaticInnerClass outerClass = new StaticInnerClass();System.out.println(outerClass.nonStaticField);outerClass.nonStaticMethod();}{System.out.println("inner class : nonstatic initialise block");// 可以在静态内部类的普通初始化块中访问内部类的静态成员System.out.println(StaticInnerClass.staticField); // 静态成员变量StaticInnerClass.staticMethod(); // 静态成员方法// 不可以在静态内部类的普通初始化块中访问外部类的非静态成员/* System.out.println(nonStaticField);StaticInnerClass.this.nonStaticMethod(); */// 可以通过创建外部类实例的方式来访问外部类的实例成员StaticInnerClass outerClass = new StaticInnerClass();System.out.println(outerClass.nonStaticField);outerClass.nonStaticMethod();}public static void staticMethod(){System.out.println("inner class : static method");// 可以在静态内部类的类成员方法中访问内部类的静态成员System.out.println(StaticInnerClass.staticField); // 静态成员变量StaticInnerClass.staticMethod(); // 静态成员方法// 不可以在静态内部类的类成员方法中访问外部类的非静态成员/* System.out.println(nonStaticField);StaticInnerClass.this.nonStaticMethod(); */// 可以通过创建外部类实例的方式来访问外部类的实例成员StaticInnerClass outerClass = new StaticInnerClass();System.out.println(outerClass.nonStaticField);outerClass.nonStaticMethod();}public void nonStaticMethod(){System.out.println("inner class : nonstatic method");// 可以在静态内部类的实例成员方法中访问内部类的静态成员System.out.println(StaticInnerClass.staticField); // 静态成员变量StaticInnerClass.staticMethod(); // 静态成员方法// 不可以在静态内部类的实例成员方法中访问外部类的非静态成员/* System.out.println(nonStaticField);StaticInnerClass.this.nonStaticMethod(); */// 可以通过创建外部类实例的方式来访问外部类的实例成员StaticInnerClass outerClass = new StaticInnerClass();System.out.println(outerClass.nonStaticField);outerClass.nonStaticMethod();}}public static void main(String[] args){}private static void sop(Object obj){System.out.println(obj);}}


0 0