`
xiaoheliushuiya
  • 浏览: 405075 次
文章分类
社区版块
存档分类
最新评论

【初学者常见问题】从外到内,从内到外(内部类剖析2)

 
阅读更多

【初学者常见问题】从外到内,从内到外(内部类剖析1) http://blog.csdn.net/pearyangyang/article/details/17280403

上一篇文章测试了静态内部类和非静态内部类的区别,下面将站在功能的角度上来挖掘内部类的潜能。

Java语法机制声明一个外部类是不能多重继承的。而内部类则填补了这个空白。

引用(Thinking In Java):

每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

下面引入一个例子:

interface Incrementable{
	void increment();
}
//Callee1实现了Incrementable接口,重写了increment()方法
class Callee1 implements Incrementable{
	private int i = 0;
	public void increment(){
		i++;
		System.out.println(i);
	}
}
class MyIncrement{
	public void increment(){
		System.out.println("Other opertion");
	}
	static void f(MyIncrement mi){
		mi.increment();
	}
}
//Callee2继承了MyIncrement类,重写了它的incement()方法
class Callee2 extends MyIncrement{
		private int i = 0;
		public void increment(){
			super.increment();
			i++;
			System.out.println(i);
		}
		private class Closure implements Incrementable{
			public void increment(){
				Callee2.this.increment();
			}
		}
		//方法实例化了一个Incrementable(也可以称为是Closure)
		Incrementable getCallBackReference(){
			return new Closure();
		}
}
class Caller{
		private Incrementable callbackReference;
		Caller(Incrementable cbh){
			callbackReference = cbh;
		}
		void go(){
			callbackReference.increment();
		}
	}
public class CallBacks{
	public static void main(String args[]){
		Callee1 c1 = new Callee1();			//实现了Incrementable接口的c1
		Callee2 c2 = new Callee2();			//继承了MyIncrement类的c2
		//MyIncrement调用了他的静态方法f(MyIncrement mi),c2调用了他的increment()方法,
		//super.increment()输出"Other operation",然后再System.out.println(i)输出i是1
		MyIncrement.f(c2);
		//实例化Caller
		Caller caller1 = new Caller(c1);
		//c2.getCallBackReference()也是返回的一个Closure对象
		Caller caller2 = new Caller(c2.getCallBackReference());
		caller1.go();//这里就相当于Caller1的对象调用increment()方法,输出1
		caller1.go();//i自加,输出2

		//这里就相当于Closure对象调用increment()方法,
		//方法Callee2.this.increment()实际又回到了外部类Callee2的increment()方法
		//super.increment()输出other operation(),
		//第二步执行i++【i在MyIncrement.f(c2)方法执行后就变成1了】,所以这次再自加输出2
		caller2.go();

		//这个步骤同上
		caller2.go();
	}
}

外部类Callee1实现了Incrementable接口,而Callee2继承了MyIncrement类,并且重写了increment()方法,但是如果还想实现Incrementable接口的时候,方法就不允许了,于是要想实现其相应的功能可以引入内部类来继承Incrementable接口,这样它也能得到相应的功能特性。这也是内部类给我最深刻的作用。

另外内部类还有以下pla pla的特性:——Thinking In Java

◆内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。

◆在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

◆创建内部类对象的时刻并不依赖于外围类对象的创建

◆内部类是一个独立的实体,和组合不是同一个概念


分享到:
评论

相关推荐

    Malware-Analysis-Training:来自@pedramamini和@erocarrera的退休初学者中级恶意软件分析培训材料

    来自@pedramamini和@erocarrera的已退休初学者/中级恶意软件分析培训材料。该课程最后一次于2010年提供,材料于2020年开源。该课程材料以LaTeX + Beamer编写,可以和模式呈现。 概述 逆向工程已经从传统上仅限于少数...

    visualc++6.0新手入门

     window编程的内部分析  改变控件的字体颜色和背景色  程序设计专业问与答  得到应用程序自身的文件名  用代码隐藏、最小化、最大化窗口  动态改变对话框的宽度  隐藏或显示控件  用mci播放Mp3  改变Push ...

    常规Java工具,算法,加密,数据库,面试题,源代码分析,解决方案.zip

    本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...

    VC C++编程例子解析及学习经验集合

    一些不常见的VC数据类型  window编程的内部分析  改变控件的字体颜色和背景色  程序设计专业问与答  得到应用程序自身的文件名  用代码隐藏、最小化、最大化窗口  动态改变对话框的宽度...

    从零开始学单片机C语言教程-电子版

    本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...

    单片机C语言

    本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包2

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JSP高级编程

    本书既适合初学者阅读,也适合具有一定JSP基础的开发人员深入研究使用。 前 言 JSP是SUN公司推出的一种新型的Internet/Intranet开发语言,和前一代Internet/Intranet开发语言(ASP、PHP)相比,JSP在以下几个方面...

    java源码包3

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包4

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    c语言编写单片机技巧

    答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。 7. 我是一名武汉大学电子科技大3的学生,学了电子线路...

    大型分布式网站架构设计与实践.带目录书签.完整版.rar

    《大型分布式网站架构设计与实践》既可供初学者学习,帮助读者了解大型分布式网站的架构,以及解决问题的思路和方法,也可供业界同行参考,给日常工作带来启发。 作者简介 陈康贤,淘宝花名龙隆,淘宝技术部研发...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...

    C语言入门经典(第4版)--源代码及课后练习答案

     本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介  本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言...

    C语言进阶-牟海军.pdf

    第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...

    C语言进阶 作者 Wrestle.Wu

    第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...

    asp.net知识库

    SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

Global site tag (gtag.js) - Google Analytics