内部类——静态内部类
来源:互联网 发布:浙江省嘉兴市行知小学 编辑:程序博客网 时间: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);}}
复制去Google翻译翻译结果
0 0
- 内部类——静态内部类
- Java笔记——静态内部类/内部类
- java——内部类、匿名类、静态内部类
- 内部类——非静态内部类
- 内部类,静态内部类
- 内部类----静态内部类
- 内部类相关——定义、匿名内部类、回调实现及静态内部类
- 内部类——局部内部类
- 内部类——匿名内部类
- 静态内部类&非静态内部类
- 静态内部类&非静态内部类
- 静态内部类&非静态内部类
- 内部类:非静态内部类,静态内部类,局部内部类,匿名内部类详解
- 内部类---静态内部类和非静态内部类
- 内部类 静态内部类 成员内部类 局部内部类 匿名内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- 内部类(静态内部类 成员内部类 局部内部类 匿名内部类)
- 内部类---(静态内部类、成员内部类、匿名内部类、局部内部类)
- sublineText里面输入中文解决方法
- 硬件调试的步骤
- 使用js实现tab页签切换效果
- 1152. 简单的马周游问题
- 嵌入式 十个最值得阅读学习的C开源项目代码
- 内部类——静态内部类
- Memcached深度分析-memcached 说明1
- UVa139 - Telephone Tangles(水题)
- OGRE中用到的设计模式
- vs 2013下的_CRT_SECURE_NO_WARNINGS
- L5智能净饮机,一键解决小妈妈们泡奶的烦恼
- CKEditor+CKFinder+jsp整合配置
- Memcached深度分析
- 【cocos2dx 3.2】一个都不能死4 游戏层