Java编程中组合、继承和代理的区别
最近在看《Java编程思想》这一本书,看到第7章复用类,学习的时候查了查网上的资料,感觉都说得不是很清楚,就来说说我的看法。
复用类即实现代码复用的类,Java中大概分为三种:组合、继承、代理(实际Java没有提供对代理的直接支持)。
- 组合:要使用A类的方法,为了不改变其原有结构,在一个新的类B中创建A类的一个对象a,以创建的这个对象a来调用A类的方法。
- 继承:要使用A类的方法,不改变其原有结构,创建一个类B,继承自A,这个类B拥有A类的所有方法和属性,并能自身做扩展,拥有A所没有的属性和方法。
- 代理:要使用A类的方法,不改变其原有结构,在一个新的类B中创建A的对象a,并且在B中创建方法fb,方法内部是a调用A类的方法,但是使用时是B的对象调用其自身方法fb。
下面来看例子():
1.组合
//组合
//:multiplexing/Getresult.java
class Calculater {Calculater() {System.out.println("use composition");}int Sum() {int res = 0; for (int i = 0; i < 1000;i++) {res += i;}return res;}
}public class Getresult {private Calculater cal;public Getresult(){cal = new Calculater();}public static void main(String[] args) {Getresult result = new Getresult();System.out.println(result.cal.Sum());}
}/*output
use composition
499500
*/
2.继承
//:multiplexing/GetresultInheritance.java
public class GetresultInheritance extends Calculater{GetresultInheritance(){System.out.println("use inheritance");}public static void main(String[] args) {GetresultInheritance result = new GetresultInheritance();System.out.println(result.Sum());}
}
/*output
use inheritance
499500
*/
3.代理
//:multiplexing/GetResultProxy.java
public class GetResultProxy {private Calculater cal = new Calculater();public long GetSum(){System.out.println("use proxy");return cal.Sum();}public static void main(String[] args) {GetResultProxy result = new GetResultProxy();System.out.println(result.GetSum());}
}
/*output
use proxy
499500
*/
那么三种复用方式的访问权限又是怎样的呢?组合是调用类
1.组合
public class Getresult {private Calculater cal;public Getresult(){cal = new Calculater();}public static void main(String[] args) {Getresult result = new Getresult();System.out.println("use compositon");result.cal.B();result.cal.C();}
}class Calculater {Calculater() {}private void A () {System.out.println("private method");}protected void B() {System.out.println("protected method");}public void C() {System.out.println("public method");}
}/*output
use compositon
protected method
public method
*/
2.继承
public class GetresultInheritance extends Calculater{GetresultInheritance(){System.out.println("use inheritance");}public static void main(String[] args) {GetresultInheritance result = new GetresultInheritance();result.B();result.C();}
}/*output
use inheritance
protected method
public method
*/
3.代理
public class GetResultProxy {private Calculater cal = new Calculater();public void B() {cal.B();}public void C() {cal.C();}public static void main(String[] args) {GetResultProxy result = new GetResultProxy();System.out.println("use proxy");result.B();result.C();}
}/*output
use proxy
protected method
public method
*/
可以看到,实际上三种方式都只能访问protected和public方法,调用private方法则会报错。虽然组合使用的是该类的成员对象调用方法,但是Java的private成员方法只支持包含该方法的类内部访问。
转载于:https://www.cnblogs.com/whason/p/10778086.html
Java编程中组合、继承和代理的区别相关推荐
- java编程里的values怎么使用,详解Java编程中super关键字的用法
这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...
- java程序设计专业介绍_简介Java编程中的Object类
这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下 Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每 ...
- Java编程中的注意点
Java编程中的注意点 Java基础部分 1.Java存放浮点数精度问题 Java中在HashMap存放浮点数会有精度问题,可以使用字符串来存放 2.while(k–)的相关问题 上面那个while的 ...
- java必背代码_新人福利,Java编程中必须要死记硬背的几十个代码
原标题:新人福利,Java编程中必须要死记硬背的几十个代码 自己总结,没有先后顺序,希望对大家有用 向文件末尾添加内容 字符串有整型的相互转换 转字符串到日期 java.util.Date = jav ...
- java编程中的异常分析及面向对象的思考总结[图]
java编程中的异常分析及面向对象的思考总结[图] 1.异常: 程序中出现的不正常现象. 2.异常的由来: 程序在运行的过程中出现了不正常的情况,程序把它看成对象提取了属性行为(名字,原因,位置等信息 ...
- java编程之线程,继承Thread类,匿名内部类的写法
package ThreadTest; //java编程之线程,继承Thread类,匿名内部类的写法 public class Test3 {public static void main(Strin ...
- Java编程中“为了性能”需做的26件事
下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说, ...
- JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...
说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...
- Java编程中忽略这些细节,Bug肯定找上你
摘要:在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. 本文分享自华为云社区<Java编程中容易忽略的细节总结丨[奔跑吧!JAVA]>,作者:j ...
- Java编程中“为了性能”尽量要做到的一些地方 [转]
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...
最新文章
- 11.字典:当索引不好用时
- 滴滴魅族手机人脸识别没有反应_手机UI颜值排名榜单,小米MIUI排到第九,魅族没有上榜...
- React Native移动开发实战-4-Android平台的适配
- 插槽的使用_思维导图
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
- Maven : [ERROR] Project xxx is duplicated in the reactor @
- 步骤五 · 4-9 解决getElementsByClassName()兼容性 未解决
- python写一个定时关机软件
- 一文解释NDP协议(IPv6邻居发现协议)ICMPv6
- 风格迁移篇---SAnet:风格注意网络下的任意风格转换
- mysql统计字数_使用SQL确定文本字段的字数统计
- 恒流源差分放大电路静态分析_多级放大电路以及差分放大电路
- Java 使用 iText5 API 根据需求导出 PDF
- 线上抓娃娃机火了三个月了,你玩了吗?
- 西班牙首相被中国新零售圈粉!天猫总裁靖捷透露了一个“合伙人计划”
- [篇二章七]_安装卸载 VMware Tools
- 安卓开机画面_领克的开机画面,你修改了?
- 转:AIX菜鸟成长日志
- 不怕牺牲的shooow
- 外汇期权交易看涨期权?外汇期权交易的基本交易有哪些?