UML中的联系(association)、聚合(aggregation)和组合(composition)三个概念很相似,也很难理解。 今天看到这篇文章解释得很清楚,所以在这里转一下, 希望能对需要的人有所帮助。
联系
联系(association)表明某个对象可以向另一个对象通过某种方式发送消息。发送消息的方法可以通过指针成员变量, 也可以是方法参数、局部变量等等。例如:

class A
{
private:
B* itsB;
};
聚合
聚合(aggregation)是一种特殊的联系,它表明了“部分”到“整体”的关系,显著的特点就是不能包含循环的联系 (就是说,部分中不能包含整体)。如:

class Node
{
private:
vector<Node*> itsNodes;
};
上述代码只有当子节点不会成为父节点的父节点时(即,必须是树结构,不能是图结构),才能称之为聚合。
组合
组合(composition)跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。例如:

class Car
{
public:
virtual ~Car() {delete itsCarb;}
private:
Carburetor* itsCarb
};
Ver 2: 2008/11/7
Ver 1: 2008/11/3
基本概念
- Python居然支持复数。如(-5+4j)。但要注意虚数单位单独使用时要写成 1j,不能写成 j。
- 与Perl和PHP的区别:单引号和双引号没有任何区别。没有插值功能。
- 三引号:''' 和 """ 相当于Perl的heredoc。
- 行尾不需要用分号,分号仅用于一行写多条语句的情况。跟BASIC的冒号有些相似。
- 缩进是有语义的!建议使用TAB缩进
- 逻辑运算符只有 and or not,没有 && || !
- 没有自增自减运算符,--a 相当于 -(-a),a--语法错
- 赋值语句不是表达式,如 y = (x = 1) 语法错
- 字符串切片是很好用的: 'Hello'[0] == 'H',以前只有Basic才有这个功能,其他语言都没有。当然Python比Basic要强大得多
- cmp函数相当于Perl的 <=> 和 cmp,由于python有类型,所以无需像perl那样用两个运算符
- []、()、{} 的布尔值是False,跟JavaScript不同(JavaScript中空数组和空对象都是true)。与Perl类似,但Perl可以用环境来解释。
运算符与表达式
- 运算符 ** 乘幂,Perl也有。
- 字符串的 * 表示重复,相当于Perl的 x 运算符。
- 居然还有专用于整除的 // 。别跟Perl 6的 // 混淆了。
控制流
- if-elif-else,Perl为if-elsif-else,bash为if-elif-fi
- if、elif等控制流语句后面要加冒号,很像PHP的语法
- while和for循环可以带else,循环正常结束时就会执行else。不用像C语言那样,循环结束时要检查循环变量是否等于终值,以判断是否正常结束。赞
- range函数生成的结果不包括终点。比较:Perl的 .. 运算符包括终点。所以,Python的range(a,b)理解成C语言的 for(i=a;i<b,i++) 好些。
- 什么都不做的pass语句,算是个python特色
- enumerate能同时迭代key和value,很不错。for key, value in enumerate(LIST):
函数
- 函数中使用全局变量需要用global关键字,类似于PHP
- DocString,又一个python特色,函数的第一个逻辑航的字符串作为文档字符串。类似于POD和javadoc,不过是写在函数体内的。还能通过"函数名.__doc__"访问
- lambda:类似于perl的闭包
- int()函数在字符串转整数时,不能用来转浮点数字符串,也不能转包含字母的字符串。如int("1.2")、int("123abc")都是语法错误,而并不返回 1、123。
数据结构
- 列表:定义方式为 a=[1,2]。等价于perl的数组/列表
- 元组(tuple):定义方式为 a=(1,2)。
- 要注意列表中的列表不会被打散,如 a=[1,2], b=[a,3,4],结果就是 b=[[1,2],3,4]。这一点与Perl不同。
- 字典:定义方式为 c={'a':1, 'b':2}。等价于perl的散列。注意两点:
- 定义和访问时,key必须用引号引起来。
- 使用{}定义,使用[]访问,即c['a']。与Perl不同。
- 列表赋值是引用赋值。要想拷贝,必须用切片:b = a[:]。Perl程序员要注意。
- 列表的sort会改变原列表。
例外
- try-except-finally,相当于java的try-catch-finally
- 还有else,当没有发生异常、正常结束try块时执行。跟for/while的else块一样
- 故意抛出异常叫raise,java里面叫throw
面向对象
- 数字和字符串(对象)是不可变的。那么如何理解a=a+1?实际上是a+1创建了一个新对象赋给a,而a原来的对象被回收了。学习Python必须改变原来的“变量是个盒子”的看法
- (-1, 100)之间的整数会被缓存,就是说即使写成 a=10; b=10; ,a和b还是同一个对象(a is b == True)
- python的长整型是无限大的
- 类的__init__函数类似于C++的构造函数;__del__函数类似于C++的析构函数。
- 类方法定义的第一个参数必须为self,调用时这个参数会被传递为对象本身。类似于perl,perl中第一个参数也会被传递为对象本身,不过需要程序员自己写 my $self = shift; 来接收。
- 用C++的话来说,所有成员函数都是虚函数。
- 调用基类方法时要手工传递self,如 Parnet.__init__(self, name)。
模块
- import foo; 相当于perl的 use foo;
- from foo import bar 相当于perl的 use foo qw/bar/;
Servlet有一个很有意思也很有用的功能,就是Filter。 所谓Filter,就是在用户请求到达 Servlet 之前、或者 Servlet 执行之后, 执行的一段小程序,这段程序可以对用户请求做预处理, 或者对Servlet返回的结果进行一些公用处理。
Filter可以在请求到达 Servlet 之前执行, 甚至即使请求一个静态页面或图片等,Filter也会被优先执行。 这样我们可以通过Filter对应用程序内的所有对象(包括Java程序和静态内容)进行预处理。 (这个功能恐怕PHP程序就无法做到了。)
阅读全文 »几乎所有的Web开发语言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的。
作用域分为四种,分别为:
| page | 在当前页面有效(仅用于JSP中) |
| request | 在当前请求中有效 |
| session | 在当前会话中有效 |
| application | 在所有应用程序中有效 |
前两节(1, 2) 分别介绍了 GenericServlet 和 HttpServlet 的用法。 这一节将介绍 ServletContext 和 ServletConfig 这两个接口。 通过这两个接口,我们可以在web.xml中设置一些参数,如数据库地址、用户名密码等,供 Servlet 使用, 这样每次参数值变动时,不用重新编译Servlet了。
阅读全文 »上一节我们介绍了 javax.servlet.Servlet接口和继承javax.servlet.GenericServlet抽象类生成Servlet的方法。 而实际上,直接继承GenericServlet并不方便也不实用, 更多的情况下是继承javax.servlet.http.HttpServlet来生成Servlet。
阅读全文 »介绍完工具和基本概念,现在终于开始介绍Servlet的编写方法了。 为了便于理解,我们将采用eclipse+Lomboz作为开发环境, 一切的操作都可以在eclipse中完成。 如果你还没有安装好Lomboz,请参考前几篇文章配置好环境。
我们将建立一个名为 com.idv2.learnjsp 的包,用于容纳所有的示例程序。 下面我们就看看最基本的Servlet的创建方法。
阅读全文 »在Servlet/JSP学习笔记(1)-tomcat和eclipse的安装中, 我介绍了eclipse和tomcatPlugin的安装和配置方法。 但今天发现,使用tomcatPlugin创建项目时,不会自动生成web.xml,需要手工编辑,这多少有些不方便。 (关于web.xml的简单介绍参考这里。)
实际上,开发和调试Servlet/JSP程序时,一个叫做Lomboz的插件更为强大、更好用。 Lomboz其实是一个开发J2EE程序的强大插件,Servlet/JSP只是小菜一碟而已。
下面就来介绍一下Lomboz的安装方法。关于 eclipse 和 Tomcat 的安装请参考 前一篇文章。
阅读全文 »关于BS结构(浏览器-服务器结构)、HTTP基本原理等基础知识相信大家比我清楚, 我就不废话了。不知道的同学去google一下。
什么是Servlet和JSP
用Java开发Web应用程序时用到的技术主要有两种,即Servlet和JSP。 Servlet是在服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是服务器) 负责执行Java程序。而JSP(Java Server Page)则是一个页面, 由JSP容器负责执行。
阅读全文 »由于项目需要,最近不得不开始学习JSP和Struts了。 三年前曾经学过JSP,而且还做过一个小程序,不过现在早已经扔到九霄云外去了。 为了不落后于时代,决定开始从今天学习JSP!
虽然我很喜欢用vim,但开发Java程序首选环境是eclipse,咱也不能太无知了啊。 所以安装eclipse是第一件事儿。另外Web服务器Tomcat也是必不可少的。 下面是各个软件的下载链接。
- Tomcat 5.5.25, Tomcat服务器
- eclipse 3.2.2, eclipse
- tomcatPlugin 3.2.1, eclipse的Tomcat插件
eclipse我没有使用最新版本的3.3,而是用了稍老些的3.2.2。这个旧版本的还真不好找, 你如果是从eclipse的主页上进入下载页的话, 应当选择右侧的Browse downloads中的By Project,然后选择Eclipse Platform, 才能到达上述的下载页面。
至于JDK,大家应该都知道怎么装我就省略了。
阅读全文 »