Java中组合、继承与代理之间的关系。

在Java中如何将一个已经定义好的类尽可能多的重复使用是提高开发效率和质量的关键。而下面我们要讲述的三种方式便是涉及到怎样去复用类让代码更优雅。

一、组合

定义:在新的类中产生现有类的对象。

组合的例子其实随处可见,比如说我们在类中定义一个String类型的变量时就使用了组合,因为String本身就是类。

public class FuUse {/** 添加一个String类型的对象s* */private String s;public FuUse(String s){this.s = s; }
}

 

二、继承

定义:通过extends关键字绑定子父类关系。

继承在这一层面来说,就是令子类继承父类所允许的(公共的或者受保护的)属性和方法。如果子类仅需要实现父类中所含的方法,那么对于子类来说在继承父类后就可以什么都不做了(子类是父类的扩展),如下面的代码:

/*
* 定义父类Father
* */
class Father{public void fun1(){System.out.println("fun1");}public void fun2(){System.out.println("fun2");}public void fun3(){System.out.println("fun3");}
}/*
* 定义子类Son
* 继承父类Father
* */
class Son extends Father{/** 啥也不做* */
}
public class FuUse {public static void main(String[] args) {Son son = new Son();son.fun1();son.fun2();son.fun3();}
}
/*
* output:
* fun1
* fun2
* fun3
* */

三、代理

定义:代理是组合和继承的中庸之道,即像组合那样在新类中定义了现有类的对象,又像继承那样拥有了现有类所有的可用方法。

可能有的人刚开始不理解,组合和代理不是一个道理吗?哪里来的区别?但是这两者确实有区别,只不过不像继承那样明显,让我们一起来看看。

/*
* 定义一个Tree类
* */
class Tree{/** 定义树的浇水方法* */public void getWater(){System.out.println("water");}/** 定义树的光照方法* */public void getSun(){System.out.println("Sun");}/** 定义树的施肥方法* */public void getManure(){System.out.println("Manure");}
}
/*
*定义Flower类
*在Flower类中使用了代理
*/
class Flower{private Tree tree = new Tree();/** 定义花的浇水方法* */public void getWater(){tree.getWater();}/** 定义花的光照方法* */public void getSun(){tree.getSun();}/** 定义花的施肥方法* */public void getManure(){tree.getManure();}
}

通过查看上面的代码相信你也看出了端倪。没错,在组合中虽然也在新类中定义了现有类的对象,但是新类说到底并不能直接调用现有类的方法,还是得依靠现有类对象的引用来调用方法。

而在代理中我们虽然也是使用了现有类对象的引用,但是我们写出了新类的方法并封装了现有类所有的方法,就好像继承一样。我们可以通过调用新类自己的方法去执行现有类的方法,相当于在新类中代理了现有类的方法。

转载于:https://www.cnblogs.com/old-driver-lgq/p/10806278.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鳗鱼刺多怎么处理图像_怎么在做鱼前去除鳗鱼刺?

展开全部去除鳗鱼鱼32313133353236313431303231363533e59b9ee7ad9431333365633937刺的方法: 鳃除法和背除法一、鳃除法1、将鱼洗净,去鳞、鳃、鳍后,从鳃部取出内脏。2、擦干水分,平放在菜墩上,掀起鳃盖,把头与脊骨连接…

游戏服务器红点系统,Unity简易的红点系统RedPoint System

由于是展示,主要就三个脚本using System.Collections;using System.Collections.Generic;using UnityEngine;public class RedPointConst{public const string main "Main";public const string mail "Main.Mail";public const string mailSy…

java学习(112):simpledateformat进行格式化

package com.zx; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; //员工信息类 //date类 public class test50 {private String name;private String sex;private Date birth;public void showme(){System.out.println(this.getName…

[转帖]什么是α射线、β射线、γ射线

什么是α射线、β射线、γ射线 https://www.sohu.com/a/230945619_1001247211、α射线 放射性核素发生衰变时放出α粒子,产生α射线。α粒子是一个高速运动的氦原子核。对于天然放射系列的核素放出α粒子的能量一般在4~8兆电子伏(MeV)范围,初…

matlab 写excel 慢_我在12w+的Python库中,发现了让Excel快到起飞的秘密......

Amber | 作者图片源自网络在这篇文章里,小编向大家介绍了Excel在数据分析中的妙用。不知大家在看完后,有没有亲自动手去体验下呢?有没有遇到什么问题呢?虽说Excel在处理小批量数据时的优势显而易见,但软件终究不是万能…

华为云服务器安装win10系统,云服务器可以安装win10吗

云服务器可以安装win10吗 内容精选换一换本节定义了云耀云服务器上报云监控的监控指标的命名空间,监控指标列表,各项监控指标的具体含义与使用说明,用户可以通过云监控检索云耀云服务器服务产生的监控指标和告警信息。SYS.ECS对于不同的操作系…

java学习(113):Calendar类

import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class test53 {public static void main(String[] args){//获取当前时间并且获取当前系统时间创建一个日历实例Calendar calCalendar.getInstance();//获取当前时间的年月日int …

CEF 添加F5刷新快捷键

Keyboardcodes&#xff1a;https://www.androidos.net.cn/android/4.3_r1/xref/external/webkit/Source/WebCore/platform/chromium/KeyboardCodes.h 1.首先要让我们自己的CefClient这个类公有继承CefKeyboardHandler 2.添加键盘事件构造函数 virtual CefRefPtr<CefKeyboard…

python 离散数据时间序列图_每个人都学的会的数据分析

数据分析已经成为数据时代各行各业突破各自行业发展瓶颈的最有效手段&#xff0c;无论是公司职员还是个体商户或大公司管理者&#xff0c;都需要有数据分析的能力。很多人认为数据分析能力就是对数据进行描述和做出漂亮的统计图形的能力&#xff0c;这是狭隘的理解。数据分析能…

java学习(114):Calendar类方法before

import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; //员工信息类 //date类 public class test50 {private String name;private String sex;private Date birth;public void showme(){System.out.println(this.getName());System.out.p…

12.06

尝试编写&#xff0c;多种方法实验&#xff0c;先学会表格控件的导入导出转载于:https://www.cnblogs.com/qss520/p/10101524.html

notion函数_Notion使用指南 | Database篇

注&#xff1a;本篇文章为「侦探学园」&#xff08;BestDet&#xff09;专栏「学习利器锻造铺」中的稿件&#xff0c;首发于「侦探学园」。上篇文章给大家介绍了Notion的一些基本内容&#xff0c;但对于小白来说&#xff0c;上手还是有一定难度的。简单回顾一下上一篇文章的内容…

java学习(115):math方法

//math import java.util.Scanner; public class test55 {public static void main(String[] args){Scanner innew Scanner(System.in);System.out.println("请输入一个数字&#xff0c;求出他的绝对值");System.out.println("绝对值为"Math.abs(in.nextIn…

zemax模拟ld_Zemax光学设计实例(83)在非序列模式下LD阵列的光束整形

导论&#xff1a;半导体激光器(Laser Diode&#xff0c;LD)是很常用的激光器件&#xff0c;普遍应用在光通信、激光泵浦等领域。阵列LD通常因为管芯空间分布的原因导致光束质量较差&#xff0c;需要光束整形以后才能使用。本文以LD bar条为例&#xff0c;介绍在非序列模式下对L…

玩转oracle 11g(13):命令学习1

1建表&#xff0c;建个学生表&#xff0c;包含id&#xff0c;学号&#xff0c;性别&#xff0c;姓名&#xff0c;年龄&#xff0c;电话号码&#xff0c;奖学金 create table Student ( id varchar(20) primary key not null,--学生的id为唯一主键 xh number(4), --学号 se…

Vagrant 构建 Linux 开发环境

Vagrant 是一个简单易用的部署工具&#xff0c;用英文说应该是 Orchestration Tool 。它能帮助开发人员迅速的构建一个开发环境&#xff0c;帮助测试人员构建测试环境, Vagrant 基于 Ruby 开发&#xff0c;使用开源 VirtualBox 作为虚拟化支持&#xff0c;可以轻松的跨平台部署…

我的世界javamod怎么装_装暖气片,10个有8个人都想知道的这点事儿!

话说&#xff0c;以前北方集中供暖施工&#xff0c;住户可是啥都不带操心的&#xff0c;毕竟...啥时候装&#xff0c;怎么装&#xff0c;装在哪儿&#xff0c;啥时间打压试水&#xff0c;啥时间开、关&#xff0c;公家都给安排妥妥地&#xff0c;反正家连家&#xff0c;户连户的…

玩转oracle 11g(14):命令学习2

6继续玩&#xff0c;改变查询结果列名 select name as xm,birthday as workday from student;--修改列名name为xm&#xff0c;birthday为workday select * from student; 7 select xh||sex from student--将选择的字段竖行排列 8 select name,sal, case when sal<10000 t…

玩转oracle 11g(15):命令学习3

11插入数据 INSERT INTO student VALUES (A007, null,女, 小华, 24-7月-15, 27,17891345129,32000,工程部); select * from student where xh is null;--查找某一项值为空 12 select coalesce(XH,0) from student--将空值转换为实际值 13按指定方式排序 select name,depo,sa…

使用Topshelf管理Windows服务

目的&#xff1a;以控制台方式开发Windows服务程序&#xff0c;调试部署方便。 https://www.cnblogs.com/itjeff/p/8316244.html https://www.cnblogs.com/gossip/p/4506142.html using System;using System.Collections.Generic;using System.Linq;using System.Text;using Sy…