- 浏览: 103121 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (99)
- 经济 (1)
- dwr (2)
- 测试 (0)
- java (29)
- resin (1)
- oracle (3)
- 感悟 (1)
- jvm (15)
- mina2 (5)
- j2se (12)
- linux (28)
- protobuf (1)
- tcp/ip (0)
- jdbc (0)
- 数据库 (4)
- 游戏 (0)
- 技术文档 (1)
- nosql (2)
- 算法 (2)
- apache (2)
- mysql (1)
- hashcode (1)
- spring (2)
- quartz (5)
- netcat (2)
- 分页 (1)
- 正则 (0)
- shell (1)
- lsof (1)
- nginx (1)
- git (1)
最新评论
-
fys124974704:
你试下将第三条写成以下这样,你会发现你的结论不对:select ...
ORACLE分页SQL语句 -
ikon:
两个乘数没有转成integer,而是当成字符串;BigInte ...
计算任意2个正整数的乘积 -
kidding87:
效率不是很高,思路没有问题,但是你的两个乘数输入都都转为Int ...
计算任意2个正整数的乘积 -
k1280000:
------------------------同意!
学习之道
JAVA在设计接口和类的规则时,有一个明确的规定。JAVA不支持类(实现)的多重继承,但支持接口(定义)的多重继承。
我已经无从了解这个设计的初衷,但这样的规定隐含了以下的意义。
接口是设计的产物,即在需求设计时定义的对软件功能的定义。而类是实现的产物,它是在实现过程中根据实现的具体情况而完成的。如果用代码来说明就是:
在设计时我需要我设计的“模块”提供两个功能:
1.提供两个整数相加的功能。
2.提供两个字符串连接的功能。
我是一个伟大的设计师,为了不影响我的整体思路,我不会在这时停下来去实现它,所以我需要一个类似伪代码的东西来记录我的实现思路。java说,好,我们为你提供一个叫接口的东西,你只写下你要实现的东西不用提供具体实现方法。
view plaincopy to clipboardprint?interface IMyFunc {
public int add(int a, int b);
public String concat(String str1, String str1);
}
interface IMyFunc {
public int add(int a, int b);
public String concat(String str1, String str1);
}
。。。。。。。其它设计。
好了,哪个小匪来领实现这个任务?
小匪甲领取了这个编码任务。分析大当家的设计思想,啊这个好办。
view plaincopy to clipboardprint?class MyMathImp implements IMyFunc{
public int add(int n1,int n2) {
//因为传进来的都是整数,如果不是整数在编译时就出错了,
//所以我不用检查,直接的相加,哈哈,今天工资混到手了。
return n1 + n2;
}
public String concat(String s1,Strings2) {
//哎,这个,这个好象要检查一下吧,如果有一个字符串是null,
//我是显示"字符串null"还是显示"字符串"呢?如果两个都为null,
//我是显示一个"null"还是显示"nullnull"呢?
//真复杂,严密性比具体实现还复杂,我干脆把它放到另一个方法中吧。
return checkedConcat(s1,s2);
}
String checkedConcat (String s1,String s2){
if(s1 == null && s2 == null) return "null";
if(s1 == null) s1 = "null";
else s2 = "null";
return s1 + s2;
}
}
class MyMathImp implements IMyFunc{
public int add(int n1,int n2) {
//因为传进来的都是整数,如果不是整数在编译时就出错了,
//所以我不用检查,直接的相加,哈哈,今天工资混到手了。
return n1 + n2;
}
public String concat(String s1,Strings2) {
//哎,这个,这个好象要检查一下吧,如果有一个字符串是null,
//我是显示"字符串null"还是显示"字符串"呢?如果两个都为null,
//我是显示一个"null"还是显示"nullnull"呢?
//真复杂,严密性比具体实现还复杂,我干脆把它放到另一个方法中吧。
return checkedConcat(s1,s2);
}
String checkedConcat (String s1,String s2){
if(s1 == null && s2 == null) return "null";
if(s1 == null) s1 = "null";
else s2 = "null";
return s1 + s2;
}
}
checkedConcat我还想被别的地方调用,所以我不想设计成ptivate的。所以我设计的MyModuleImp从外面可以看到三个方法。
大当家的叫我提供两个方法,而我的实现有三个方法,幸亏有接口啊,我发布这个模块时只提供接口的文档。这样你在智能感应的IDE中一打开这个接口看到的只是大当家定义的两个方法。
所以:接口可以只将设计意图的方法暴露给调用者。
那么,当我一个类提供了不同功能的方法时,我想在不同时候只显示某类功能的方法,怎么办?
其实这个问题Sun的代码中都没有很好地处理。比如我的一个类提供了对象的初始化方法和对象释放的方法,整数运算的方法和字符串运算方法以及图形运算方法。当然这只是举例。
有人说这个类设计不合理,这么多不同类型的功能应该在不同类中实现。
说得对!但是..........
如果我们的对象是本地生成的,多次new多个对象成本不是太高,如果我们的对象是从远程调用的,那么多个对象的生成成本就很高了。
另外任何对象自身管理的方法和业务方法不能分到两个类中实现吧?一个只有自身管理的方法的类除了自恋还有什么用?而有些必须要被始化和释放等管理的对象只有业务方法它也工作不起来,所以至少有两类功能要在同一类中完成。假如它们的重载方法足够多时,你会看到它们是很多功能的方法按字母排序混合在一起。
典型的就是URLConnection类,你打开它时,设置请求参数的方法,获取响应头域的方法,获取输入输出的方法一大堆。不过还好是它们的命名方式使很多功能相同的方法能排在一起。
如何有效的组织一个实现的不同功能的方法的分类?我们可以通过多接口来完成。
这个思想早在COM时代就已经采用了,无论你获取的是IUnKnown接口还是IDispatch接口还是业务接口,其实反回的都是同一个CoClass对象,但你获取不同接口看到的是不同功能的函数。同时你只要实例化一次,获取到任何接口就可以从这一接口生成其它接口,这对于调用者是非常有意义的,我不仅能得到不同功能的函数分类,而且不需要多次实例化多个对象。
view plaincopy to clipboardprint?interface IMath {
public int add(int a, int b);
public int mul(int a, int b);
}
interface IStrUtil {
public String concat(String s1, String s2);
public String Upper(String s1);
}
interface IObjManager {
void init();
void destory();
}
class MyModuleImp implements IMath, IStrUtil, IObjManager {
public int add(int a, int b) {
return a + b;
}
public int mul(int a, int b) {
return a * b;
}
public String concat(String s1, String s2) {
return checkedConcat(s1, s2);
}
public String Upper(String s1) {
return checkedUpper(s1);
}
public void init() {
System.out.println("init.........");
}
public void destory() {
System.out.println("destory.........");
}
String checkedConcat(String s1, String s2) {
if (s1 == null && s2 == null)
return "null";
if (s1 == null) s1 = "null";
else s2 = "null";
return s1 + s2;
}
String checkedUpper(String s1) {
if (s1 == null) return null;
return s1.toUpperCase();
}
}
interface IMath {
public int add(int a, int b);
public int mul(int a, int b);
}
interface IStrUtil {
public String concat(String s1, String s2);
public String Upper(String s1);
}
interface IObjManager {
void init();
void destory();
}
class MyModuleImp implements IMath, IStrUtil, IObjManager {
public int add(int a, int b) {
return a + b;
}
public int mul(int a, int b) {
return a * b;
}
public String concat(String s1, String s2) {
return checkedConcat(s1, s2);
}
public String Upper(String s1) {
return checkedUpper(s1);
}
public void init() {
System.out.println("init.........");
}
public void destory() {
System.out.println("destory.........");
}
String checkedConcat(String s1, String s2) {
if (s1 == null && s2 == null)
return "null";
if (s1 == null) s1 = "null";
else s2 = "null";
return s1 + s2;
}
String checkedUpper(String s1) {
if (s1 == null) return null;
return s1.toUpperCase();
}
}
OK!
IObjManager om = new MyModuleImp(); //或getObjFromNet如果我们把生成实例的方法统一封装起来,以及对象的生命周期管理都规定在一个类似IUnknown的接口中,我们就可以把多功能的不同类有一个统一的管理行为,就象远程EJB对象的实例化。
om. 这时我们看到的只是IObjManager接口的方法,我们可以init.destory.
当我们需要它的业务方法时:
IMath m = (IMath)om; //相当于QueryInterface
m. 这时我们看到的只是math相关的功能方法。
另外当我们想增加一个方法并保留原有方法时只需在新的接口中声明,并让实现类继承自这个接口(其实就是在implements关键字后面加上接口名称)。这样新旧接口可以并存使用,既不影响以前的代码,也不影响后来的人使用新接口:
view plaincopy to clipboardprint?interface IMathEx{
public int add(int a, int b);
public int mul(int a, int b);
public double sqrt(double a);
}
class MyModuleImp implements IMath,IMathEx, IStrUtil, IObjManager{
//增加public double sqrt(double a)的实现
}
interface IMathEx{
public int add(int a, int b);
public int mul(int a, int b);
public double sqrt(double a);
}
class MyModuleImp implements IMath,IMathEx, IStrUtil, IObjManager{
//增加public double sqrt(double a)的实现
}
这样原来使用IMath来计算“加和乘“的代码根本不受影响,而新的程序可以使用IMathEx来计算“加,乘和开方”运算。
总结一下多接口的优点:
1、有效的组织不同功能的代码;
2、使对象具有统一的管理方法,同时避免多次生成对象带来的开销。
发表评论
-
Quartz定时任务学习(一)简单任务
2012-04-27 12:30 847学习quartz首先了解三个概念: 调度器:负责调度作 ... -
介绍Quartz
2012-04-27 12:22 1418介绍Quartz Quartz是一个开源的任务调度 ... -
理解Quartz触发器(1)
2012-04-27 11:37 870Quartz中一个Job往往是 ... -
Quartz中SimpleTrigger的探讨
2012-04-27 11:34 7121.来写一个每隔10秒启动一次任务的例子. import j ... -
理解Java对象序列化
2012-02-15 09:38 697关于Java序列化的文章早 ... -
认识Arrays(一)打印
2012-02-03 16:52 578Arrays提供了一组操作array的静态方法。 一、基本类 ... -
oracle java数据类型对应表
2011-12-05 13:37 0[img]http://dl.iteye.com/upload ... -
计算任意2个正整数的乘积
2011-11-12 21:36 1211接上一篇整数的阶乘算法,来计算2个正整数的乘积; 算法如下: ... -
计算任意正整数的阶乘
2011-11-12 20:17 670由于阶乘的结果会超出java数据类型的最大范围,所 ... -
Java调用外部程序技巧
2011-11-08 09:17 804前些天使用Java调用外部程序的时候,发现线程会堵塞在wa ... -
多核平台下的JAVA优化
2011-11-08 09:12 636现在多核CPU是主流。利用多核技术,可以有效发挥硬件的能力 ... -
使用 Eclipse Memory Analyzer 进行堆转储文件分析
2011-11-07 17:09 780http://www.ibm.com/developerwor ... -
infoQ 文档ppt
2011-11-07 11:43 1258http://www.docin.com/app/user/c ... -
游戏性能监控
2011-11-07 10:18 01、cpu消耗(耗时)监控 在功能代码前后取时间值,相减,发 ... -
使用Cacti监控你的网络(一)- Cacti概述及工作流程
2011-11-07 09:36 681http://blog.sina.com.cn/s/b ... -
浅析 Java Thread.join()
2011-10-29 09:25 868一、在研究join的用法之前,先明确两件事情。 1.join ... -
hashmap线程不安全在哪里?
2011-10-13 11:33 1081大家都知道HashMap不是线程安全的,但是大家的理解 ... -
java面试题及答案(基础题122道,代码题19道)
2011-10-10 22:54 660http://ilovelate.itpub.net/post ... -
关于UnsupportedOperationException异常
2011-09-29 12:03 576我们在使用collection框 ... -
关注一下druid
2011-09-26 09:21 702关注一下druid,阿里开源的jdbc组件,可以监控数据库访问 ...
相关推荐
界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活 ...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。 ...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
在Java中创建和使用定时器的一个小例子代码,绘制数字的Canvas对象,设置当前的绘图对象,设置定时器的运行时间,并包括了生成随机数的For循环,考察了多个Java技巧的编程,不仅仅是定时器的使用。
6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 ...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
使用集合的技巧 83 Collections--集合工具类 83 Arrays—数组对象工具类 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 <java.lang>System 89 <java.lang>Runtime 90 <java....
java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...
1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与...
学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...