面向对象的三大特征
面向对象的五大基本原则
单一职责原则SRP
指一个类的功能要单一,不能包罗万象。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性.
开放封闭原则OCP
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。主要体现在两个方面:
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
- 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
里氏替换原则LSP
子类应当可以替换父类并出现在父类能够出现的任何地方。父类应尽可能使用接口或者抽象类来实现
依赖倒转原则DIP
传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!即:
- 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
- 抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
接口分离原则ISP
- 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
- 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
关键字static
- 静态方法和静态变量是属于某一个类,而不属于类的对象
- 静态变量是供类所有的对象共享的,不安全,很少用
- 在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之可以
- 静态变量和静态代码块是在加载类的时候初始化的
构造方法
- 什么是构造方法
- 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成的,其功能主要是完成对象的初始化。
- 构造方法的特征
- 它具有和类相同的名称
- 它不包含返回值
- 它不能在方法中用return语句返回一个值
- 构造方法的几个细节
- 每个Java类中至少有一个构造方法
- 关于默认构造方法Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。
- private修饰的构造方法,表示当前类不能被创建。Util类
方法的重载 overload
- 方法的名称相同
- 参数类型或参数个数不同
- 返回值的类型和访问权限可以不同
方法的重写 Override
- 子类继承父类之后,重写父类的方法
- 方法的名称,参数类型和参数个数相同
- 返回类型必须要兼容
- 不能降低方法的访问权限,如:父类的方法是public的,子类的就不能是private的
- private,static和final方法不能被重写
- Exception需要更具体
特殊变量super
- 特殊变量super,提供了对父类的访问。
- 可以用super访问父类被子类隐藏的变量或覆盖的方法
- 每个子类构造方法的第一条语句,都隐含地调用super(),如果父类没有这种形式地构造函数,那么在编译地时候就会报错。
嵌套类与内部类
嵌套类:在类的定义体中定义另外的类
如果使用static声明,即静态嵌套类,则不能访问外部类的非静态成员;
内部类:非静态嵌套类
- 内部类可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于同一级,或处于方法之内,甚至是一个表达式的一部分
- 内部类可以访问外部类的成员
- 初始化内部类的对象时需要有外部类的实例变量,如Outer.Inner inner=new Outer().new Inner().
抽象类(Abstract)
抽象方法
- 只需声明,而不需实现
- 它的方法体的实现交给该类的子类根据自己的情况去实现
- 构造方法、静态方法、私有方法、final方法不能被声明为抽象方法
- 必须用abstarct关键字来修饰
例:
public abstract boolean setCheck(Animal argAnimal);
包含抽象方法的类就叫抽象类
- 抽象类必须用abstract关键字来修饰
- 不能被实例化
- 抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类
public abstract class CheckCenter{ }
接口
- 接口是抽象方法和常量值的定义的集合,而没有变量和方法的实现
- 接口中的成员都是public访问类型的,接口里的变量默认是用public static final标识的
- 在接口中声明方法时,不能使用native、static 、final 、synchronized 、private 、protected等修饰符
- 可以定义一个新的接口用extends关键字去继承一个已有的接口
- 可以定义一个类用implements关键字去实现一个接口中的所有方法
- 还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法
- 一个类可以实现一个或多个接口,一个接口可以继承一个或多个接口
抽象类与接口的区别
语法层面
- 语法结构不同
- 类继承/实现时使用的关键字也不同(extends/implements)
编码层面
- 抽象类只能继承一个,接口可以实现多个
- 抽象类可以定义默认实现,接口不行
设计层面
- 抽象类的定义是为了实现类的父子关系,是"is a "的关系
- 接口是为了定义某种行为规范
final关键字
修饰变量
final标记的变量即成为常量,只能赋值一次。
- 修饰局部变量
- 修饰函数参数变量
- 修饰成员变量
- final标记的成员变量必须在声明的同时或在类的构造方法中显示赋值
- 修饰static变量
修饰方法
final标记的方法不能被子类重写