【初学者常见问题】从外到内,从内到外(内部类剖析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
◆内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
◆在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
◆创建内部类对象的时刻并不依赖于外围类对象的创建
◆内部类是一个独立的实体,和组合不是同一个概念
分享到:
相关推荐
来自@pedramamini和@erocarrera的已退休初学者/中级恶意软件分析培训材料。该课程最后一次于2010年提供,材料于2020年开源。该课程材料以LaTeX + Beamer编写,可以和模式呈现。 概述 逆向工程已经从传统上仅限于少数...
window编程的内部分析 改变控件的字体颜色和背景色 程序设计专业问与答 得到应用程序自身的文件名 用代码隐藏、最小化、最大化窗口 动态改变对话框的宽度 隐藏或显示控件 用mci播放Mp3 改变Push ...
本次分享的资源涵盖了Java面试的各个方面,从基础知识到高级技术,从数据库到框架应用,都做了深入的探讨和总结。具体内容包括: Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心...
一些不常见的VC数据类型 window编程的内部分析 改变控件的字体颜色和背景色 程序设计专业问与答 得到应用程序自身的文件名 用代码隐藏、最小化、最大化窗口 动态改变对话框的宽度...
本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...
本书定位于让初学者从零起步,轻松学会单片机高级编程C语言以及实战技术。书中首先简要介绍了8051单片机的主要构成,然后重点介绍了单片机Cx51高级编程语言开发与仿真环境的使用方法,透彻地分析了Cx51的语法结构,...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
本书既适合初学者阅读,也适合具有一定JSP基础的开发人员深入研究使用。 前 言 JSP是SUN公司推出的一种新型的Internet/Intranet开发语言,和前一代Internet/Intranet开发语言(ASP、PHP)相比,JSP在以下几个方面...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
答:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。 7. 我是一名武汉大学电子科技大3的学生,学了电子线路...
《大型分布式网站架构设计与实践》既可供初学者学习,帮助读者了解大型分布式网站的架构,以及解决问题的思路和方法,也可供业界同行参考,给日常工作带来启发。 作者简介 陈康贤,淘宝花名龙隆,淘宝技术部研发...
2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...
2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...
本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介 本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言...
第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...
第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解...
SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL-DMO实现定制SQL Scripts Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server) C# 获取...
基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...