开发意义:
网络优势:
对人的影响:
运行环境:
项目人员:
需求:
选择用户:(A)普通用户 (B)管理员登陆 退出程序(Q)
备注:
(A)普通用户
(B)管理员登陆 可以删除用户(设定是否可用的状态) , 修改用户数据
用户登录(A) 账号,密码 (登陆成功/失败 )
用户注册(b)正则表达式 首位不能以数字开头,6位英文+数字 密码=数字< /FONT>
程序功能:
游客:
查看图书:添加图书:修改图书:删除图书:
修改用户名: 修改密码: 查看所有用户: 注销:
管理员:
面向对象是什么? 面向过程和他什么关系?类和对象的的关系?
-
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
-
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
-
类:是对一类事物的描述,是抽象的&具有共同属性和行为的对象集合,不占用内存。类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起
-
属性:变量(字段 field)
行为:函数(方法 method) -
对象:对象是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念
它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的
在Java中的Object类是所有类的超类,常称作上帝类
对象.toString();
介绍 这个方法来自类继承Object.class
实际上 p.getClass().getName()+"@"+Integer.toHexString(hashCode());
面向对象的三特性:
1)get/set +私有属性= 封装性
-
把描述一个对象的属性和行为封装成一个类,把具体的业务逻辑功能实现封装成一个方法,< /FONT >
< /FONT >
-
其次封装的意义还有效的保护属性通过访问修饰符私有化属性(成员变量),公有化方法。< /FONT >
隐藏对象的属性和实现细节,仅对外公开接口< FONT >
2)用现成的(取共有特征和方法形成高一层的类:父亲) 继承 :从上往下的实例化 < /FONT >
super();//默认调用父类的构造方法 这里面传值就可以 必须在第一句话
-
实现代码的复用,所有的子类所共有的行为和属性抽取为一个父类,所有的子类继承该类可具备父类的属性和行为,继承具有单一性和传递性。< /FONT >
3)多态 其实是在继承的基础上的< /FONT >
-
程序中定义的引用类型变量所指向的具体类型和调用的具体方法在程序编译阶段无法确定,而是在运行期才能确定该引用类型变量指向具体哪个对象而调用在哪个类中声明的方法。
-
多态的表现形式有强制类型转换,向上造型等,多态可分为行为多态和对象多态。
-
行为多态:同一个run( ){ }方法,不同的对象调用时会有不同的实现,猫调用时是跑,鱼调用时是游,鸟调用时是飞。
-
对象多态:同一个对象,可以被造型为不同的类型,比如同一个人对象,可以被造型为儿子,父亲,员工等。
五大基本原则:
1、单一职责原则(SRP)
一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿。
2、开放封闭原则(OCP)
对象或实体应该对扩展开放,对修改封闭。
更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!
这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
3、里氏替换原则(LSP)
在对象 x 为类型 T 时 q(x) 成立,那么当 S 是 T 的子类时,对象 y 为类型 S 时 q(y) 也应成立。(即对父类的调用同样适用于子类)
4、依赖倒置原则(DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
可以这样理解,上面我举例子的时候先说了兔子和绵羊,然后才推出食草动物。但如果我们继续认识了牛、马等食草动物,我们会发现我们需要不断调整食草动物的描述,这样程序会变得僵化,所以我们不应该让子类依赖于实体,不应该让父类模块依赖于子类模块。所以我们需要将食草动物设计为抽象类,即抽象类或接口。这样下层只需要实现相应的细节而不会影响父类。
5、接口隔离原则(ISP)
不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!
比如,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后会发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
构造方法(无参, 必有,优先级 低):初始化工作 1.没有返回类型 名字和类一样
重载(有参 但不同 ,名字一样 优先级 比构造方法高):可以快捷生成
子类 重写:对父类的方法不满足,改写他 1. 这里对访问权限只能大不能小
2.返回值类型&方法名&参数 不能变
存储方式:集合
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。 功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。 再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。 当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。