最近在看《Java编程思想》这一本书,看到第7章复用类,学习的时候查了查网上的资料,感觉都说得不是很清楚,就来说说我的看法。
复用类即实现代码复用的类,Java中大概分为三种:组合、继承、代理(实际Java没有提供对代理的直接支持)。

  1. 组合:要使用A类的方法,为了不改变其原有结构,在一个新的类B中创建A类的一个对象a,以创建的这个对象a来调用A类的方法。
  2. 继承:要使用A类的方法,不改变其原有结构,创建一个类B,继承自A,这个类B拥有A类的所有方法和属性,并能自身做扩展,拥有A所没有的属性和方法。
  3. 代理:要使用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编程中组合、继承和代理的区别相关推荐

  1. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  2. java程序设计专业介绍_简介Java编程中的Object类

    这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下 Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每 ...

  3. Java编程中的注意点

    Java编程中的注意点 Java基础部分 1.Java存放浮点数精度问题 Java中在HashMap存放浮点数会有精度问题,可以使用字符串来存放 2.while(k–)的相关问题 上面那个while的 ...

  4. java必背代码_新人福利,Java编程中必须要死记硬背的几十个代码

    原标题:新人福利,Java编程中必须要死记硬背的几十个代码 自己总结,没有先后顺序,希望对大家有用 向文件末尾添加内容 字符串有整型的相互转换 转字符串到日期 java.util.Date = jav ...

  5. java编程中的异常分析及面向对象的思考总结[图]

    java编程中的异常分析及面向对象的思考总结[图] 1.异常: 程序中出现的不正常现象. 2.异常的由来: 程序在运行的过程中出现了不正常的情况,程序把它看成对象提取了属性行为(名字,原因,位置等信息 ...

  6. java编程之线程,继承Thread类,匿名内部类的写法

    package ThreadTest; //java编程之线程,继承Thread类,匿名内部类的写法 public class Test3 {public static void main(Strin ...

  7. Java编程中“为了性能”需做的26件事

    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说, ...

  8. JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...

    说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...

  9. Java编程中忽略这些细节,Bug肯定找上你

    摘要:在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. 本文分享自华为云社区<Java编程中容易忽略的细节总结丨[奔跑吧!JAVA]>,作者:j ...

  10. Java编程中“为了性能”尽量要做到的一些地方 [转]

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

最新文章

  1. 11.字典:当索引不好用时
  2. 滴滴魅族手机人脸识别没有反应_手机UI颜值排名榜单,小米MIUI排到第九,魅族没有上榜...
  3. React Native移动开发实战-4-Android平台的适配
  4. 插槽的使用_思维导图
  5. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
  6. Maven : [ERROR] Project xxx is duplicated in the reactor @
  7. 步骤五 · 4-9 解决getElementsByClassName()兼容性 未解决
  8. python写一个定时关机软件
  9. 一文解释NDP协议(IPv6邻居发现协议)ICMPv6
  10. 风格迁移篇---SAnet:风格注意网络下的任意风格转换
  11. mysql统计字数_使用SQL确定文本字段的字数统计
  12. 恒流源差分放大电路静态分析_多级放大电路以及差分放大电路
  13. Java 使用 iText5 API 根据需求导出 PDF
  14. 线上抓娃娃机火了三个月了,你玩了吗?
  15. 西班牙首相被中国新零售圈粉!天猫总裁靖捷透露了一个“合伙人计划”
  16. [篇二章七]_安装卸载 VMware Tools
  17. 安卓开机画面_领克的开机画面,你修改了?
  18. 转:AIX菜鸟成长日志
  19. 不怕牺牲的shooow
  20. 外汇期权交易看涨期权?外汇期权交易的基本交易有哪些?

热门文章

  1. php7 生成.so,centos8 php7 生成 openssl.so 文件执行make时报错:【已解决】
  2. 计算机网路网络层之IP协议(3)——IP编址
  3. NP、OSPF基本配置
  4. Kubernetes详解(二十二)——Deployment控制器
  5. k8s 1.16安装metrics server
  6. HDOJ--1879--继续畅通工程
  7. Arts 第十二周(6/3 ~ 6/9)
  8. 解析Health端点数据获取异常数据
  9. ES6 = 函数参数
  10. 饿了么的架构设计及演进之路