面向对象编程
一、面向对象
面向过程、面向对象、函数式编程
C语言已经成为面向过程编程的代表,C++、Java是面向对象编程的代表。
面向过程是将问题不断拆解,一步步来解决,采用的是一种自顶而下的编程方式。 而面向对象是将问题抽象成不同对象,并通过对象的属性和对象来实现问题。 OOA -> OOD --> OOP(分析到设计再到编程实现的一个过程)
二、类与对象
了解类与对象的概念,了解对象引用与垃圾产生的原理。
new一个类实例对象,会在内存中开辟一块堆内存存储成员变量的值,同时类的实例化对象接收会开辟一块栈内存,且它的引用指向堆内存的地址,Person p = new Person()
。
一个栈内存地址只会指向一个堆内存,如果引用被改变了,那么它将会变成垃圾对象,被JavaGC回收机制给回收。
Person p1 = new Person()
Person p2 = new Person()
p1.name = "ng";
p2.name = "nangong";
p2 = p1
对于类中属性必须使用private进行封装,如果想要改变它的值,可以通过setter()、getter()方法来修改。 通过构造方法实现实例化对象的属性初始化(自动调用、无返回值、名称与类名保持一致)。如果没有明确定义构造方法,将会自动生成一个无参构造方法。也可以进行构造方法的重载(一般编写按参数个数升降序排列)。
匿名对象,不指定对象名称的的实例化对象,通过new关键字直接实例化,不存在引用关系,一经调用后就会成为内存的垃圾,被GC给回收。
修饰符
控制类属性、方法访问权限
- 公开级别:用 public 修饰,对外公开
- 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
- 默认级别:没有修饰符号,向同一个包的类公开.
- 私有级别:用 private 修饰,只有类本身可以访问,不对外公开,通过getter\settter可以实现其他类访问。 代码块
普通、构造、静态代码块
静态代码块只会在类被加载的时候执行,用于类初始化,只会执行一次。如果只使用静态属性、方法,该类的普通代码块不会被执行。
静态代码块、静态属性初始化是在构造方法调用和普通代码块前先执行的。如果有继承关系,那么父类优先执行。同时静态代码块在主类中是优于main主方法前调用的。
父类静态属性、静态代码块--> 子类静态属性、静态代码块 --> 父类普通代码块、普通属性初始化 --> 父类构造方法 --> 子类普通代码块、属性初始化 --> 子类构造方法
public class Oop {
public static String name = "落";
public static void printName(){
System.out.println(Oop.name);
}
static {
System.out.println("主类中静态代码块");
}
public static void main(String[] args) {
System.out.println(Cat.name);
Oop.printName();
new Cat();
new Cat();
{
System.out.println("普通代码块");
}
}
}
class Cat {
public static String name;
private int age;
public Cat(){
System.out.println("无参构造调用");
}
public Cat (String name, int age){
this.name = name;
this.age = age;
System.out.println("有参构造调用");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("其他类中静态代码块");
}
}
类加载时机:
- 创建实例化对象new;
- 使用类的静态属性或方法;
- 子类实例化对象创建,父类也会自动加载。
三、面向对象的三大特征和五大原则
三大特征
封装(Encapsulation): 通过将事物封装成抽象类,通过关键字来声明对象是否私有化,对类的内部数据提供保护。
继承(inheritance): 通过继承来实现对现有类的功能使用。无须再次编写原来的类(除非需要对原类的方法进行重写),继承的过程是一个从一般到特殊的过程,子类或派生类通过继承父类、基类、超类的方法来进行对象功能的扩展,并以此来达到逻辑功能的实现。
继承的实现方式:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态(Polymorphism):类的实例中相同方法在不同情况下有不同的表现形式。多态使不同结构对象能够共享相同的外部接口。 常见的多态就是将子类传入父类参数中,运行时调用父类方法时通过传入的子类决定 具体的内部结构或行为。
五大原则
单一职责原则(Single-Responsibility Principle):
一个类只负责一种单一功能。高内聚、低耦合,如果职责过多,会降低其内聚性。一般类只有一种单一功能,不要为其实现过多的功能点,以保证实体只有一个引起它变化的原因。
开放封闭原则(Open-Closed principle)
对拓展是开放的,对修改是封闭的。通过开放封闭原则来实现不断变化的需求,同时也能维持软件自身内部的 稳定。
1、对扩展开放,意味着有新的需求或变化时,通过多态和继承机制来重写覆盖原有行为,实现新拓展方法。 2、对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,抽象是相对稳定的,类依赖于固定的抽象。
Liskov 替换原则(Liskov-Substitution Principle)
子类能够替换基类。子类可以替换基 类,但是基类不一定能替换子类,这是对继承机制的约束,保证继承复用可靠性。
依赖倒置原则(Dependecy-Inversion Principle)
依赖于抽象,分离接口与实现,控制耦合关系,面向接口编程。
接口隔离原则(Interface-Segregation Principle)
使用多个小的专门的接口,而不要使用一个大的总接口。