Java中is-a和has-a的区别

1.“is-a”是继承的关系,比如人是动物,人和动物是继承的关系;

2.“has-a”是聚合的关系,比如人有眼睛,人和眼睛是聚合的关系;

也可以理解为 is-a 是“继承”

但has-a是“接口”关系。是“相互依赖”的关系,同时它们的生命周期都是一样的。

我们以一道scjp考题为例,来讲解"is a"和"has a"的区别 :

Your chief Software designer has shown you a sketch of the new Computer parts system she is about to create. At the top of the hierarchy is a Class called Computer and under this are two child classes. One is called LinuxPC and one is called WindowsPC.

The main difference between the two is that one runs the Linux operating System and the other runs the Windows System. Under the WindowsPC are two Sub classes one called Server and one Called Workstation. How might you appraise your designers work?

a) Give the goahead for further design using the current scheme

b) Ask for a re-design of the hierarchy with changing the Operating System to a field rather than Class type

c) Ask for the option of WindowsPC to be removed as it will soon be obsolete

d) Change the hierarchy to remove the need for the superfluous Computer Class.

答案:b

解析:本题考察的知识点是“is a”和“has a”的区别。“is a”代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用 Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。

“has a”代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。

再比如张三和李四都是人,但他们的名字不一样,可以以此区分这两个具体的人。名字应该作为人的成员变量。如果将名字叫“张三”的人和名字叫“李四”的人分别定义成两个类,均继承“人”这个类,显然是不合理的。

以上内容摘自<>

1. IS-A, HAS-A两种经典OO模式:

1.1 You can just use IS-A to figure out the relationship of Subclass and Superclass. If B is a A, that means class B extends class A. That‘s TRUE everywhere in the inheritance tree.

Example: Canine(犬科动物) is-A Animal, So Class Canine extends Animal; Wolf is-A Canine, So class wolf extends Canine; But note you can‘t change their position, Animal is-A Canine never happen, so class animal never extends Canine.

1.2 HAS-A, we can remember a case: Bathroom HAS-A Tub, Tub NEVER HAS-A Bathroom, that means class Bathroom has a instance variable(field) of class tub.

as we can see:

public class Bathroom()

{ private Tub tub;

Tub.flush(); }

public class Tub()

{ public void flush()

{ //more flush code here. } }

原文:https://www.cnblogs.com/asasooo998/p/11622644.html

java is-a_java中 is - a和 has - a的区别相关推荐

  1. java is a_java中 is - a和 has - a的区别

    Java中is-a和has-a的区别 1."is-a"是继承的关系,比如人是动物,人和动物是继承的关系; 2."has-a"是聚合的关系,比如人有眼睛,人和眼睛 ...

  2. 探究Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类

    转载自     探究Java File类中list().listFiles()的使用及区别,认识和使用匿名内部类 内容概要: 1.认识File类: 2.File的构造函数: 3.list()及其重载方 ...

  3. java Null==undefined_javascript中的undefined和null有什么区别

    原标题:javascript中的undefined和null有什么区别 java中的undefined和null的区别有:类型不同前者返回的是未定义值后者是对象:转换原始类型方式不同前者是不支持转换后 ...

  4. java is a_java中的继承(is a )和组合(has a)

    我们知道java语言有三大特性:封装,继承,多态 但是继承和封装却是一对有点矛盾的两个方面,怎么理解?? 我们想想:封装的目的是想让隐藏类中的属性和方法.但是在继承过程中,我们的子类肯定会继承父类的方 ...

  5. java interface class_Java中常量定义在interface和class的区别(转)

    最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...

  6. java continue goto_Java中goto和break、continue实现区别

    goto 关键字很早就在程序设计语言中出现.事实上,goto 是汇编语言的程序控制结构的始祖:"若条件 A, 则跳到这里:否则跳到那里".若阅读由几乎所有编译器生成的汇编代码,就会 ...

  7. Java开发工具中Compile、Make和Build的区别

    针对Java的开发工具,一般都有Compile.Make和Build三个菜单项,完成的功能的都差不多,但是又有区别. 编译,是将源代码转换为可执行代码的过程.编译需要指定源文件和编译输出的文件路径(输 ...

  8. java generics_java – Generics中原始类型和?之间的区别

    的ArrayList简单地表示"任何类型".换句话说,可以将任何类型的ArrayList分配给这样的变量.这可以是ArrayList< Integers>,ArrayL ...

  9. Java线程池中submit()和execute()方法有什么区别

    两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法返回有计算结构的Future对象,它定义在ExecutorServic ...

  10. java int parse_java中Integer.parseInt和Integer.valueOf的区别

    展开全部 他们返回类型的不同是最大的原因: static int parseInt(String s) 将字符串参e69da5e6ba9062616964757a686964616f313333613 ...

最新文章

  1. 追溯XLNet的前世今生:从Transformer到XLNet
  2. 软件的可维护性与可复用性(一)(Java与模式笔记)
  3. linux之uniq 命令详解
  4. LCD显示异常分析——开机闪现花屏【转】
  5. 声明jpa批注处理器_如何使用反射基于JPA批注记录您的数据模型
  6. 龙贝格方法c语言,龙贝格算法
  7. 怎样在MySQL中显示中文,而不出现乱码?
  8. powerdesigner mysql 自增主键_PowerDesigner Mysql 主键自增、初始值、字符集
  9. 【maven】maven dependencyManagement 锁定Jar包版本
  10. 带你如何使用npm下载包
  11. Siemens 软件下载
  12. 写全武汉的火锅店..更新版 恩..欢迎补充 ^_^
  13. 伴着代码,那个女孩儿慢慢长大
  14. 有感而发:总结很重要
  15. CSAPP--BombLab
  16. 零基础如何学习 Web 安全?
  17. 容联云sdk 打包maven
  18. 基于Cesium的卫星及空间碎片的轨迹展示
  19. 【shell脚本】——归档文件脚本
  20. 【CE实战】Clicker Heroes 快速通关

热门文章

  1. java 电子编号生成器_业务编号生成器
  2. linux 查看主机版本,Linux下如何查看版本信息的方法步骤
  3. 精讲23种设计模式-基于装饰模式~设计多级缓存框架
  4. ETL异构数据源Datax_datax-web简述_09
  5. windows下RocketMQ下载、安装、部署、控制台
  6. Vue Cli 项目结构简述
  7. VBA 网页提取特定内容 - 网抓实践总结
  8. textarea支持a标签_微慕小程序开源版A标签优化说明
  9. GPUImage – 色阶 GPUImageLevelsFilter
  10. C语言 fopen 函数 - C语言零基础入门教程