`
IO_oI
  • 浏览: 21959 次
社区版块
存档分类
最新评论

java内部类用法小结

    博客分类:
  • Java
阅读更多
定义:
顾名思义,创建于外部类之内的类。可以定义于外部类的方法内。
下面用I类表内部类,O类表外部类。(I:inner,O:outer)


用途:
1.private修饰的内部类用来隐藏实现的细节
2.匿名类使方法实现更简洁、优美(例:工厂方法,适配器方法)
3.可用于有效的实现“多重继承”
4.水平有限暂不明。


特性:(可类比O类方法)
1.可以使用O类所有成员(包括private)
2.可以被static、private修饰(O类不可以)
3.可以匿名,但必须进行继承
4.可实例化,如果被static修饰:new O.I();否则:new O().new I()  (O类引用.new I())
5.不可在O类的导出类中被覆盖 (这点不像O类方法)
6.可被继承,但其指向O类的“秘密的”引用必须被初始化


用途示例1:
class Outer {
	private class Inner {
		void innerMethod(String s) {
			System.out.println(s);
		}
	}
	private Inner inner = new Inner();
	public void outerMethod(String s) {
		inner.innerMethod(s);
	}
}
public class Test1 {
	public static void main(String[] args) {
		new Outer().outerMethod("InnerMethod print the string");
	}
}

用途示例2:
//工厂模式示例
interface Product {
	String getName();
}
interface ProductFactory {
	Product getProduct();
}
class CandyFactory implements ProductFactory {
	public Product getProduct() {
		return new Product() {
			public String getName() {
				return "Candy";
			}
		};
	}
}
class JellyFactory implements ProductFactory {
	public Product getProduct() {
		return new Product() {
			public String getName() {
				return "Jelly";
			}
		};
	}
}
public class Test1 {
	static void production(ProductFactory factory) {
		Product p = factory.getProduct();
		String name = p.getName();
		System.out.println(name);
	}
	public static void main(String[] args) {
		production(new CandyFactory());
		production(new JellyFactory());
	}
}

用途示例3:
interface Interface1 { void methodI1(); }
interface Interface2 { void methodI2(); }
class Class1 { void methodC1() {} }
class Class2 { void methodC2() {} }

public class Test1 {
	private class RealInterface implements Interface1,Interface2 {
		public void methodI1() { System.out.println("Implements Interface1"); }
		public void methodI2() { System.out.println("Implements Interface2"); }
	}
	private class RealClass1 extends Class1 {
		@Override
		void methodC1() { System.out.println("Implements Class1"); }
	}
	private class RealClass2 extends Class2 {
		@Override
		void methodC2() { System.out.println("Implements Class2"); }
	}
	private RealInterface i = new RealInterface();
	private RealClass1 c1 = new RealClass1();
	private RealClass2 c2 = new RealClass2();
	public void methodI1() { i.methodI1(); }
	public void methodI2() { i.methodI2(); }
	void methodC1() { c1.methodC1(); }
	void methodC2() { c2.methodC2(); }
	public static void main(String[] args) {
		Test1 t = new Test1();
		t.methodI1();
		t.methodI2();
		t.methodC1();
		t.methodC2();
	}
}

特性示例:
/*
1.可以使用O类所有成员(包括private) 
2.可以被static、private修饰(O类不可以) 
3.可以匿名,但必须进行继承 
4.可实例化,如果被static修饰:new O.I();否则:new O().new I()  (O类引用.new I()) 
5.不可在O类的导出类中被覆盖 (这点不像O类方法)
6.可被继承,但其指向O类的“秘密的”引用必须被初始化
 */
interface Anonymity {}
class Outer {
	Outer() { 
		System.out.println("Outer()");
		new Inner1();
	}
	private String s = "Outer string s";
	public class Inner1 {
		Inner1() { 
			System.out.println("Inner1()");
		}
		private String s = "Inner string s";
		void print() {
			System.out.println(s);
			//特性1
			System.out.println(Outer.this.s);
		}
	}
	//特性2
	private static class Inner2 {}
	public static class StaticInner {
		StaticInner() { 
			System.out.println("StaticInner()");
		}
	}
	public Anonymity getAnonumityClass() {
		//特性3
		return new Anonymity() {
			{
				System.out.println("AnonymityClass()");
			}
		};
	}
}
class ExtendsOuter extends Outer{
	//特性5
	ExtendsOuter() {
/*	==    super();
	==    System.out.println("Outer()");
     +      new Inner1();
*/	}
	public class Inner1 {
		Inner1() { 
			System.out.println("ExtendsOuter.Inner1()");
		}
	}
	//特性6特例
	//因为ExtendsOuter已经继承了Outer
	//从而指向外围类(Outer)的“秘密的”的引用已经通过继承关系(ExtendsOuter extends Outer)进行了初始化
	//所以不必再进行“特殊处理”
	public class ExtendsInner1 extends Outer.Inner1 {
		ExtendsInner1() { 
			System.out.println("ExtendsOuter.ExtendsInner1()");
		}
	}
}
public class Test1 {
	//特性6
	public class ExtendsInner2 extends Outer.Inner1 {
		ExtendsInner2() { 
			new Outer().super();
			System.out.println("Test1.ExtendsOuter2()");
		}
		ExtendsInner2(Outer outer) { 
			outer.super();
			System.out.println("Test1.ExtendsOuter2(Outer outer)");
		}
	}
	public static void main(String[] args) {
		Test1 t = new Test1();
		//特性4
		new Outer().new Inner1();
		new Outer.StaticInner();
		//特性5
		new ExtendsOuter();
	}
}
分享到:
评论

相关推荐

    Java中的内部类总结.doc

    java中内部类的用法,可以说也是一个重点吧,而且不易掌握。

    Java内部类原理与用法实例总结

    主要介绍了Java内部类原理与用法,结合实例形式总结分析了非静态内部类、静态内部类、局部类等相关概念、原理、用法及相关操作注意事项,需要的朋友可以参考下

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    21天学通Java-由浅入深

    245 12.3.3 在外部类外访问静态内部类 246 12.4 匿名内部类 247 12.4.1 创建匿名内部类 247 12.4.2 匿名内部类的初始化 249 12.5 综合练习 250 12.6 小结 250 12.7 习题 250 第13章 多线程(精彩视频:55分钟) 252 ...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    JAVA基础课程讲义

    JAVA.IO包相关流对象用法总结(尚学堂1002班王鑫) 165 IO中其他常用类 165 File类 165 RandomAccessFile 166 思考作业 166 上机作业 166 提高课外作业 166 第九章 多线程技术 167 基本概念 167 程序 167 进程 167 ...

    java接口与类.doc

    最近看到论坛里有个帖子在讨论接口和抽象类的区别和作用,这其实也是很多面试官喜欢问的问题,这里我就说说我的总结,顺便说说内部类的作用,当是给刚入门,或者想学习java的同学们能更好的理解它们的用法。

    Java基础【final、权限、内部类、引用类型】

    day11【final、权限、内部类、引用类型】第一章 final关键字1.1 概述1.2 使用方式修饰类修饰方法修饰变量第二章 权限修饰符2.1 概述2.2 不同权限的访问能力第三章 内部类3.1 概述什么是内部类成员内部类访问特点3.2 ...

    JAVA软件工程师_Java入门视频教程

    小结 [第9节] 1.2.1为什么需要封装1 [第10节] 1.2.1为什么需要封装2 [第11节] 1.2.2如何实现封装2 [第12节] 1.2.3如何使用包1 [第13节] 1.2.3如何使用包2 [第14节] 1.2.4类成员的访问控制1 [第15节] 1.2.4类成员的...

    Java中StringBuilder在高性能用法总结

    关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能是好的了,真的吗吗吗吗?...  StringBuilder的内部有一个char[], 不断的append()是不断的往

    javaSE整体学习总结,超级全面

    资源包含了,java中亿点点的细节,构成方法重载的条件,内的定义,构造器的四个要点,创建一个对象分为四步,java内部模型,栈的特点,堆的特点,方法区(又叫静态区,也是堆),this的本质,static关键字核心用法,静态的初始化块...

    JAVA程序设计教程

    内容小结.........................................................................................................................12 思考与练习............................................................

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制? 30 【基础】Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 30 【基础】Java 中的final关键字有哪些用法?...

    突破程序员基本功的16课.part2

    1.3 小结 第2课 对象与内存控制 2.1 实例变量和类变量 2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象...

    C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴。希望能对初学C++的朋友起到一点帮助作用。 ...

    疯狂Android讲义.part2

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689

    疯狂Android讲义.part1

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 ...19.10 本章小结 689

Global site tag (gtag.js) - Google Analytics