组合、继承与接口

来源:互联网 发布:会员注册软件 编辑:程序博客网 时间:2024/05/16 10:05

一、组合:has-a(鸟有翅膀)需要显示创建被组合对象

        继承:is-a(麻雀继承鸟类)隐式

1、组合可以让我们有选择的复用某些功能,而不像继承,不管怎么样复用所有非私有的功能,

当我们只需要其中的某一部分的时候,这个时候就应该考虑组合而不是继承,

2、private 类型绝对只能在本类中直接使用 至于一些间接使用的除外(用的比较少嘛)(错误说法:组合产生一个实例就可以应用其私有的东西
继承而不能使用其私有的东西)


3.继承不用说了,组合:

class Engine {          public void start() {}          public void rev() {}          public void stop() {}        }                 class Wheel {          public void inflate(int psi) {}        }                 class Window {          public void rollup() {}          public void rolldown() {}        }                 class Door {          public Window window = new Window();          public void open() {}          public void close() {}        }                 public class Car {          <span style="color:#FF0000;">public Engine engine = new Engine(); </span>//一般情况下,你应使域(field)成为 private          public Wheel[] wheel = new Wheel[4];          public Door            left = new Door(),            right = new Door(); // 2-door          public Car() {            for(int i = 0; i < 4; i++)              wheel[i] = new Wheel();          }          public static void main(String[] args) {            Car car = new Car();            car.left.window.rollup();            car.wheel[0].inflate(72);          }      } 

4.接口

定义接口格式:
[public]interface 接口名称 [extends父接口名列表]
{
//静态常量
[public] [static] [final] 数据类型变量名=常量值;
//抽象方法
[public] [abstract] [native] 返回值类型方法名(参数列表);
}


实现接口格式:
[修饰符] class 类名[extends 父类名] [implements 接口A,接口B,···]
{
类成员变量和成员方法;
为接口A中的所有方法编写方法体,实现接口A;
为接口B中的所有方法编写方法体,实现接口B;
}

例子:

定义接口

public interface AreaInterface{double pai=Math.PI;double area();}
实现接口

圆:

package jiekou;public class Circle implements AreaInterface{double r;public Circle(double x){r=x;}//实现接口中的抽象方法,求圆面积public double area(){return pai * r * r;}public String toString(){return "圆:r="+r+"\tarea="+area();}}
三角形:

package jiekou;public class Rectangle implements AreaInterface{double x,y;public Rectangle(double a,double b){x=a;y=b;}public double area()//实现接口中的抽象方法,求长方形面积{return x * y;}public String toString(){return "长方形:x="+x+";y="+y+"\t"area=+area();}}

Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。


二、网上看到的一张图:

首先是:在UML中,我们用分成三栏的长方形表示。第一栏是名称,第二栏是属性,第三栏是方法。

 

继承:唐老鸭属于鸭的一种,或者说是鸭的细化划分,而鸭属于鸟类,鸟类属于动物,这里无论表达成“是”还是属于,就是这样一个直观的关系。用实线一端带空心三角箭头表示。箭头指向父类。

 

依赖:凡是动物,生存都需要水和空气,这种必须的需求,我们称之为依赖关系。用虚线一端带箭头表示,箭头指向依赖物。

 

聚合、组合:这两个关系我们放在一起,因为她们看似十分的相似,但是却有着本质的区别。

                 很多大雁聚合在一起变成雁群,也可以说雁群里有雁,所以是整体和个体之间的关系,has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期。即雁群可以不存在了,但是孤雁仍然存在。

                      一只鸟由两个翅膀组合而成,即一只鸟有两个翅膀。虽然组合和聚合我们都说“有”什么,但是这个“有”是不同的,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如这只鸟死了,自然这两个翅膀也就不存在了。

 

关联:企鹅和气候有关联,关联是最常见的关系,表示类与类之间的联接它使一个类知道另一个类的属性和方法关联有两个端点, 在每个端点可以有一个基数, 表示这个关联的类可以有几个实例
           常见的基数及含义: 0..1:0 或1 个实例
                                             0..*: 对实例的数目没有限制
                                             1: 只能有一个实例
                                             1..*: 至少有一个实例.

接口:最后就是接口了,接口有两栏组成,第一栏的顶端加上《interface》后下方写接口名称,第二栏是接口方法。接口有自己的表示方法“实现”,虚线一端带空心三角形。实际开发中,为了更好的实现"开-闭原则",一般都是定义接口,依赖于接口,依赖于抽象。

 

还有一个概念是——多态,图中没有出现。多态顾名思义就是有很多种形式。

bush.roar()

 

 

orang.roar()

 

donald.roar()

同样是一个roar消息,却因为不同的对象可产生完全不同的结果。









0 0