在java中类和类的关系大致分三种:泛化、关联、依赖。

1. 泛化(Generalization)

"XX是一个XX"关系(is a),通常使用的关键词为 extends、implements

继承:继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

继承的特点:

1.继承关系是传递的。若类C继承类B,类B继承类A(多层继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。

2.继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。

3.继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

4.继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

5.提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑仅支持单重继承,而通过使用接口机制来实现多重继承。

注意:如果父类是接口那么其中所有的方法必须由子类重写。如果父类是抽象类那么父类中的未实现方法必须有子类重写,

一般父类

//父类
public class Car { public void drive() {
System.out.println("车可以开");
}
}
//子类
public class Bus extends Car { public void buyTickets(){
System.out.println("公交车要买票");
}
}

公交车拓展了车的功能增加了一个买票的功能

抽象父类

public abstract class Animal {
public void eat() {
System.out.println("动物可以吃东西");
}
public abstract void move();
} public class Dog extends Animal {
@Override
public void move() {
System.out.println("狗在地上跑");
}
}

有部分未实现的方法必须在子类中实现。

接口父类

public interface Phone {

	void call();

	void sendMsg();
} public class SmartPhone implements Phone {
@Override
public void call() {
System.out.println("手机可以打电话");
} @Override
public void sendMsg() {
System.out.println("手机可以发短信");
} }

所有方法都在子类实现

2.关联(Association)

"XX是XX的一部分"关系(has a)通常使用的关键字 new

当一个对象中,加入了另外一个对象时就形成关联关系。

关于分为有两种特殊的形式,聚合(Aggregation)和组合(Composition),聚合和组合只有概念上的区别,在Java中的代码实现上没有区别。

在代码中具体表现为成员变量。

1.组合

组合:表示类之间的整体和部分的关系,所有组合在一起的对象作为一个整体存在,当整体不存在了那么部分对象也就不存在了

组合就像是人体,一旦人死亡每个器官就都死亡了。

2.聚合

聚合:表示整体和部分的关系,所有聚合在一起的对象作为一个整体存在,但个体的生命周期并不依赖整体的生命周期。

聚合就像人群,即使一个个体走散了个体也能生存。

下面我们就举个例子来说明两者关系:

有如下场景,汽车要开动之前需要先清洁汽车,检修完成后使用发动机点火启动。

/**
* 汽车清理工具
*/
public class CleaningTools { private static final CleaningTools cleaningTools = new CleaningTools();
private CleaningTools() {} public static CleaningTools getCleaningTools() {
return cleaningTools;
} public void clean() {
System.out.println("清洁汽车");
} }
/**
* 汽车发动机
*/
public class Motor { public void startUp() {
System.out.println("发动汽车");
}
} public class Car { private CleaningTools cleaningTools = CleaningTools.getCleaningTools();
private Motor motor = new Motor(); public void dirver() {
cleaningTools.clean();
motor.startUp();
} public static void main(String[] args) {
Car car = new Car();
car.dirver();
}
}

在这个例子中汽车发动机和汽车就是组合关系。当汽车报废后发动机也会报废。(强关联)

汽车和汽车清理工具的关系是,即便汽车报废清理工具也能清理其他汽车。(弱关联)

3. 依赖(Dependency)

"XX用了一个XX"关系(use a)关键字 import

代码中的表现为局部变量,方法的参数,以及对静态方法的调用

1.依赖

依赖: 指两个相对独立的类,一个类负责构造另外一个类时两个类就形成了依赖关系。

依赖关系是最普遍的关系

public class StringUtil {

	public static boolean isNotEmpty(String str) {
return str != null && "".equals(str.trim());
} }
public class Customer { public static void main(String[] args) { StringUtil.isNotEmpty("111");
}
}

我们调用了StringUtil中的isNotEmpty方法,那么我们就可以说Customer类依赖了StringUtil类

4.总结

应该尽量优先使用关联,而不是泛化,因为泛化会使得类关系过于复杂化,破坏了封装性,使用组合一样可以获得已有类的功能,而且会使新类更加稳固。

实际上,从依赖 ⇒ 关联 ⇒ 泛化,类与类之间的关系更加紧密,互相之间的影响越来越大。

1.泛化

优点

  • 子类能自动继承父类的接口
  • 创建子类的对象时,无须创建父类的对象

缺点

  • 破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性
  • 支持扩展,但是往往以增加系统结构的复杂度为代价
  • 不支持动态继承。在运行时,子类无法选择不同的父类
  • 子类不能改变父类的接口

2.关联

优点

  • 不破坏封装,整体类与局部类之间松耦合,彼此相对独立
  • 具有较好的可扩展性
  • 支持动态组合。在运行时,整体对象可以选择不同类型的局部对象
  • 整体类可以对局部类进行包装,封装局部类的接口,提供新的接口

缺点

  • 整体类不能自动获得和局部类同样的接口
  • 创建整体类的对象时,需要创建所有局部类的对象

3.使用泛化还是关联。

新类是否需要向上造型。也就是说当我们想重用原类型作为新类型的内部实现的话,我们最好自己关联,如果我们不仅想重用内部实现而且还想重用接口的话,那就用泛化。

4.依赖

依赖是一种极为松散的类组织结构。

引用

http://blog.csdn.net/fantian830211/article/details/1753520

http://blog.csdn.net/qq_31655965/article/details/54645220

Java中类与类的关系的更多相关文章

  1. Java 中类与类之间的关系

    在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...

  2. 怎么去理解JAVA中类与对象的关系

    首先要明确,在现实生活中,每一个物体都有自己的基本特征,专业一点也可以说成是属性有些甚至还有一定的行为.例如 汽车的特征:有车门.有轮胎.颜色各一等等,行为:有行驶,开车门,开车灯,等等.有这些属性和 ...

  3. UML类图中类与类的四种关系图解

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. Java常用工具类题库

    一.    填空题 在Java中每个Java基本类型在java.lang包中都在一个相应的包装类,把基本类型数据转换为对象,其中包装类Integer是___Number__的直接子类. 包装类Inte ...

  5. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  6. java 学习笔记——类之间的关系之封装、继承与多态的详解

    封装 一个封装的简单例子 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联 ...

  7. Java类与类的关系、继承与多态、重写与重载

    Java类与类的关系 (1)is-a包括了 继承,实现关系 (2)has-a包括了 关联,聚合,组合关系 (3)use-a包括了 依赖关系 实现关系: 实现指的是一个class类实现interface ...

  8. Java中类的关系

    在java里类的关系大致分为三种, 1.继承(a is b):继承extends,实现implement 2.包含(a has b):组合>聚合>关联.关系亲密度越来越小,一个类在另一个类 ...

  9. java中类的关系的总结

    类和类之间存在多种关系,而这种关系在我们的代码中司空见惯,有时多种类关系很难区分 (由于水平有限,没有画出类的关系图,关系图可以参考参考链接) 继承关系 继承是指一个子类(子接口)继承父类(父接口)然 ...

随机推荐

  1. OneZero第五周第一次站立会议(2016.4.18)

    1. 时间: 13:00--13:15  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...

  2. OneZero第五周第二次站立会议(2016.4.19)

    1. 时间: 15:15--15:25  共计10分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...

  3. Django-基本概念

    目录 Django 项目创建 项目结构 应用目录 Django Django是一个开放源代码的Web应用框架, 由Python写成. 采用了MVC的软件设计模式, 即模型M, 视图V和控制器C. 这套 ...

  4. AJAX 原生态

                                                                   AJAX   原生态 原生态AJAX详解和jquery对AJAX的封装 A ...

  5. 【题解】FBI序列

    题目描述 两伙外星人策划在未来的XXXX年侵略地球,侵略前自然要交换信息咯,现在,作为全球保卫队队长,你截获了外星人用来交换信息的一段仅由“F”,“B”,“I”,“O”组成的序列.为了保卫地球和平,为 ...

  6. c++11 追踪返回类型

    c++11 追踪返回类型 返回类型后置:使用"->"符号,在函数名和参数列表后面指定返回类型. #define _CRT_SECURE_NO_WARNINGS #includ ...

  7. java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

    需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...

  8. python(27) 抓取淘宝买家秀

    selenium 是Web应用测试工具,可以利用selenium和python,以及chromedriver等工具实现一些动态加密网站的抓取.本文利用这些工具抓取淘宝内衣评价买家秀图片. 准备工作 下 ...

  9. Excel:一维表和二维表 互转

    一.一维表转二维表 数据源: 一份流水账式的值班表,为了便于打印张贴,现在需要使其变成这样的样式: 也就是从一维表变成传说中的二维表. 1.新建查询 依次单击[数据]→[新建查询] →[从文件]→[从 ...

  10. Javascript面向

    一.前言 面向对象:专注于由哪一个对象来解决这个问题,编程特点是出现了一个类,从类中拿到对象,由这个对象去解决具体问题.       对于调用者来说,面向过程需要调用者自己去实现各种函数.而面向对象, ...