面向对象编程(Object-OrientedProgramming)
基于对现实世界的规律的抽象
(一)基本概念
1.类(class):一类事物的总称
类就是一个模板,用于生成实例的内存空间。
2.实例:类的具体存在
类的实例化中,变量保存在栈内存中,存放堆内存地址
实例化的内容保存在堆内存中
3.属性:用于静态描述一类事物的特征,即类级变量(通常不公开,最好为私有)
4.行为:用于动态描述一类事物的动作,即定义方法
(二)访问修饰符—对方法、属性设置访问权限
Public:公开的,谁都可以访问,无论何时何地
Protected:受保护的,仅在当前包下面可以访问,子类可以访问(受包保护)
Private:私有的,仅在当前类下可以使用(类级私有)
Default:默认情况下,其他包无法访问
(三)核心应用
1.静态:被static修饰的属性和方法(不适用于局部变量)
只占有一次内存,实例化后仍指向该内存
不建议使用实例名来访问静态方法和属性,直接使用类名来访问
规则:
(1)任何方法调用静态属性和方法,直接使用类名.属性名或类名.方法名
(2)任何方法调用非静态属性和方法,直接使用实例名.属性或实例名.方法名
(3)尽量减少使用静态属性和方法,特别是在多线程运行环境下,坚决不允许
2.重载:Overload
同一个类中,可以有同样的方法名,但是参数个数必须不一样,或者参数类型必须不一样。如果都一样的话,顺序必须不一样。
3.重写:Override
子类覆盖父类的行为(方法)
同样的方法名,同样的参数
4.setter/getter方法
类属性通常不公开,即设为private。
使用类实例化调用setter/getter方法
使用setter方法进行值的赋值
使用getter方法进行值的调用
5.构造方法:用于实例化类的时候完成一系列的动作
是一种比较特殊的方法,必须被public修饰,无返回值类型,方法名与类名必须同名,可以带参数。
(1)属性的初始化—构造方法的重载
使用带参数的构造方法一次性可以完成属性的初始化
基本构造方法(不带参数),默认构造方法
(2)构造方法中调用其他构造方法必须在第一行,直接使用this(参数列表);
(3)类级代码块:与方法或类级变量同级,没有方法名,没有参数,在类实例化时使用.可用构造方法初始化代替,也是在类实例化时使用,运行时机完全一致。
6.抽象类:abstract
abstract用来修饰一个类,这个类成为抽象类。抽象类不能被实例化,只能被继承(必须被继承)。抽象类担负起定义规范的作用。
抽象类中可以定义普通方法,也可以定义抽象方法,抽象方法必须被子类实现(抽象方法不能被实现,只能被重写)。只有抽象类允许使用抽象方法,即abstract修饰方法时,必须位于抽象类。
Public abstractvoid MyAbstractClass(){ }。
定义一个全部为抽象方法的抽象类称为纯虚类(纯抽象类)。
7.final
被final定义的变量不能被修改,常用于定义常量。
Public finalstatic int i=100;(常与static一起用)
局部变量前加修饰符,只能用final。
final可以修饰变量,方法和类。修饰变量则变量无法修改,修饰方法则方法不能被子类重写,修饰类则类不能被继承。
final与abstract不能同时出现,修饰同一类或方法
8.接口 interface(抽象类可完全代替接口)----接口默认就是抽象
命名时前加I
用接口interface来代替纯虚类。
如:public interfaceIPeople(){ }
接口不能被实例化,不能被继承,只能被实现。
Publicclass Teacher implements IPeople(){ }
接口当中的方法只能定义,不能被实现(同抽象方法),不需要abstract修饰方法,接口当中的所有办法默认就是抽象方法。
继承只能是单一继承,接口可以多重实现。
(四)面向对象六大基本原则
1.开闭原则:通过修饰符进行访问控制,只开放必要的接口给其他类调用(封装起来)
开放的接口(方法)越少越好,可以减少代码的耦合
把改动比较频繁的接口设为私有,开放出去一个相对稳定的接口
2.里氏替换原则:用父类定义,用子类实例化,利用子类的实例替换父类的实例。
父类所拥有的行为,子类一定拥有。但是,子类所拥有的,父类不一定拥有。
子类尽量不要重写。
如:Fatherf=new Son();
3.接口隔离原则:
在不违背单一职责原则的情况下,确保一个接口只做一件事物,不要把无关的处理通过不同的参数融入同一个接口中。
4.依赖倒置原则:抽象类不应该依赖具体类,而是所有的类都应该依赖于抽象类。上层的类不应该依赖于下层的类,上下层类都应该依赖于抽象类。
核心:A类不能直接调用B类,要通过抽象类,即A----抽象类----B类(抽象类的子类)
所有行为只与抽象父类产生耦合,不与某个具体的子类产生任何关系。
5.最少知道原则:不要在方法体内完成类的实例化
6.单一职责原则:一个方法只完成一件最简单的事情,不要把无关的事情放到方法中来完成。
包括类:一个类只描述一件事物,不要把无关的属性和行为放进来
代码之美:每个方法最好只有4行代码,建议每个方法最多不要超过20行,10行为佳
(五)面向对象三大特性
1.封装:属性、行为、访问修饰符、失血模型、开闭原则、单一职责
2.继承:关键字extends 具有传递性、可覆盖性、里氏替换原则、单一继承原则
例如:publicclass Man extends People{ }
(1)子类继承父类(超类、基类、superclass)
默认的修饰符、受保护的属性或方法可以被继承。
私有的属性或方法不能被继承。
(2)行为的重写:子类覆盖父类的行为。
(3)扩展:子类新增一些父类没有的行为
(4)父类可以获取子类的实例:Father f=new Son();(里氏替换原则)
(5)祖宗类(所有类的默认父类):Object(泛型)
在Object类中定义了部分方法,可直接调用,如hashcode
其在Object类中的定义形式为:
public native int hashcode();
//由native修饰,属于本地接口,由C语言调用操作系统底层接口来实现的
(6)this代表本类实例,super代表父类实例
3.多态:抽象类、接口
重载:静态多态性
里氏替换原则:动态多态性
依赖倒置原则:动态多态性