继承和多态
一. Java bean
在java中任何一个类都可以被称为Javabean
1.提供无参构造
2.提供get/set 方法
3.序列号
自省/反射
二. MVC:不是设计模式(二十三种设计模式没有他),他是架构思想
M:Model :Java bean dao等
V:View :视图(前台) jsp/ui/awt/swing
C:Control : 控制层(业务逻辑层biz/servlet)
三. OOP的五大原则
1.**单一原则**:
一个类应该只做一件事情,代码一般要做到高内聚,低耦合。单一原则实现低耦合
2.**开闭原则**:
在设计一个软件系统模块(方法,类)的时候,应该可以再不修改原有的模块下(变更关闭)的基础上,扩展器功能(扩展开放)
3.**里氏替换原则**:
不是鸟类都会飞,企鹅要继承基类(超类)飞的行为或状态时,要传入条件,使基类中 "飞" 不起来()
Pre-condition:
每个方法调用之前,该方法应该校验传入参数的正确性,只有正确才能执行该方法,否则认为调用方违反契约,不予执行。这称为前置条件(Pre-condition)。
Post-Condition:
一旦通过前置条件的校验,方法必须执行,并且必须确保执行结果符合契约,这称之为后置条件(Post-condition)。
Invariant:
对象本身有一套对自身状态进行校验的检查条件,以确保该对象的本质不发生改变,这称之为不变式(Invariant)。
以上是单个对象的约束条件。为了满足LSP(里氏替换),当存在继承关系时,子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松;而子类中方法的后置条件必须与超类中被覆盖的方法的后置条件相同或者更为严格
继承并且覆盖超类方法的时候,子类中的方法的可见性必须等于或者大于超类中的方法的可见性,子类中的方法所抛出的受检异常只能是超类中对应方法所抛出的受检异常的子类。
4.**依赖倒置原则**:
DIP原则其实强调的是:不要让不经常发生变化的部分去依赖于经常发生变化的部分。(不要依赖于实现而是依赖抽象)
5.**接口隔离原则**:
参考文献(http://blog.csdn.net/xinchow/article/details/5462159)
接口定义的是规范使用。多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
四 多态
以父类型创建的对象只能访问父类型中的方法。
以子类为类型创建本身的现象可以访问子类中的所有方法
因为子类继承父类,子类拥有父类所有的非private方法
同时子类可以扩展内容。
1.向上转型:
子类转父类(小转大)
2.向下转型:
父类转子类(大转小,要强转,一定要使用instanceof来验证类型是否符合)
abstract 代表抽象可以用来修饰方法和类,继承抽象或者实现接口的我们称之为实现类
方法:该方法是抽象方法,实现必须重写该方法
类:抽象类,不可以创建对象。
抽象类中不一定有抽象方法,作用是为了定义功能模块。
用于被继承,由子类各自实现自己的方法体
/**
* 测试入口
* Created by HowellZhang on 2016/8/4.
*/
public class Test {
public static void main(String[] args) {
Person person=new Person();
Dog dog=new Dog();
dog.setName("旺财");
person.walk(dog);//普通人遛狗
Person feeder=new Feeder();
feeder.walk(dog);//饲养员遛狗
Person master=new Master();
master.walk(dog);//主人遛狗
}
}
/**
*普通狗类
*/
public class Dog {
private String name;
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/**
*
* 一个普通人类
* Created by HowellZhang on 2016/8/4.
*/
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void walk(Dog dog){
System.out.println("人在遛"+dog.getName());
}
}
/**
* 狗主人类
* Created by HowellZhang on 2016/8/4.
*/
public class Master extends Person{
@Override
public void walk(Dog dog) {
System.out.println("朋友带着自己的宠物"+dog.getName()+"去聚会");
}
}
/**
* 饲养员类
* Created by HowellZhang on 2016/8/4.
*/
public class Feeder extends Person {
@Override
public void walk(Dog dog) {
System.out.println("动物园内,有饲养员要遛"+dog.getName());
}
}
五 UML中常见的类关系:
1.泛化:继承 表示一般和特殊 满足is-a关系,在类图中使用空心三角+实线,箭头所指的是父类。
2.实现:表示类和接口的关系,实现使用空心三角+虚线,箭头所指的是接口。
3.关联:是一种拥有关系,满足has-a。让一个类知道另外一个类的属性和方法,关联有3种形态,在类图中使用箭头+实线。如果是双向的可以有两个箭头或者一个都没有
3.1 单向关联
3.2 双向关联
3.3 自关联
在代码中,关联通常会以成员变量的形式存在
比如Student类中有Teacher的成员存在
4.聚合:是一种强关联,是整体和部分的关系,且部分可以脱离整体而存在。如汽车和汽车的轮胎,并且聚合从语法上和关联是无法区分的,即代码中也是以成员变量的形式存在,只能从逻辑上来区分。
在类图中使用空心菱形+实线 菱形所指向的是整体
5.组合:满足like-a。类似于聚合也是整体和部分,但是区别于聚合,组合中的部分不可以脱离整体存在。如人和人的眼睛,组合是一种强聚合,是最强关联。在代码中体现方式还是成员变量,在类图中使用实心菱形+实线 菱形所指向的是整体
6.依赖:是一种使用关系 满足 use-a,即一个类的实现需要另外一个类的辅助,依赖类似于关联,依赖在形式上类似于关联,可以存在双互依赖(不推荐过多使用)。在代码中依赖体现为局部变量和静态域,使用虚线+箭头。箭头所指的是被使用者
关系强弱排序:泛化=实现>组合>聚合>关联>依赖
UML对应了9中视图
1.用例图
2.类图
3.对象图
4.顺序图
5.协作图
6.状态图
7.活动图
8.组件图
9.配置图
OOP中写代码流程
1.分析需求中的名词,确定要写哪些类
2.
3.
4.
六 接口
当某个功能跨种类存在,比如飞行中有鸟和飞机,他们在物种上没有任何关系,就无法把飞行方法定义在任何一方,重复定义会代码重复,为了把飞行定为一种规范,引入了接口。任何一个项目的起始都是从定义接口开始同样任何一个项目最有价值的部分就是接口
区分概念:
1.请求接口,访问接口,不是指Java中的interface而是双方规定的一种通讯方式
2.请求可以通过interface来实现,比如回调
接口在1.8之前只能有方法的声明和常量存在,1.8之后允许使用default关键字,还能有方法体
接口的底层就是抽象类