面向对象基本思想
一、OO概述
1.一、面向过程和面向对象的比较
* 对于一个问题的解决,面向过程,须要考虑其每一步的实现,不适合处理复杂的问题;
* 面向对象思想是一种分类的思惟模式,即思考一个问题须要哪些分类,而后对分类进行单独的思考,最后才会对某个分类下的细节进行面向过程的思索;
* 面向对象更适合处理复杂的问题,适合处理须要多人协做的问题;
* 对于描述复杂的事物,须要用面向对象的思想去宏观上分析整个系统,但在具体的微观操做的设计上,依旧须要使用面向过程思想去处理;
1.二、面向对象编程
以类的方式组织代码,以对象的方式封装数据;
1.三、面向对象的三大特征
* 封装:对数据进行封装,而后,对外提供一个操做数据的接口,使外界只能经过这些特定接口去访问数据,赋予了对象“黑盒”的特性
* 继承:是一个对象获取另外一个对象属性的过程
* 多态:一个程序中相同名字的方法表示不一样含义的状况,方法的重载是静态多态,方法的覆盖是动态多态
1.四、类和对象的理解
* 抽象:从众多的事物中抽取出共同的特征
* 对象是具体的事物,类是对对象的抽象
* 对象是现实世界中明确标识的实体,每一个对象都有本身独特的状态行为和标识
* 对象的状态: 也称为对象的特征和属性,是由当前数据域的值决定的
* 对象的行为:也称为动做,是由对象中的方法决定的
* 对象标识:类是对象的模板,对象是类的实例,能够以一个类为模板建立多个对象(实例化),对象的标识用来区分这些对象
* 当一个对象使用完毕,不在被引用时,就会被垃圾回收器(gc)回收
1.五、OOP的优点
* 易维护
* 可重用
* 可扩展
1.六、面向对象(OO)的三大领域
* 面向对象分析(OOA)
* 面向对象设计(OOD)
* 面向对象编程(OOP)
二、变量的做用域和生存期
1.一、变量做用域
* 变量的做用域变量能够在程序的什么范围内可使用
* Java程序中做用域是经过块来实现的(Java中的大括号)
* 变量在哪一个块中被声明,它的做用域就在哪个块
2.二、变量的生存期:
* 变量的生存期是对象被分配内存内存的时间期限
* 对于局部变量(基本类型),在声明时系统为该变量分配内存,当方法返回时,该变量从内存栈中清除
* 对于对象:在new建立对象时,系统将在堆中为它分配内存,当它不在被引用时,在以后的某一时刻,垃圾回收器运行时才能被回收
三、包机制
* 包是对类的封装,以一组相关类或者接口的集合
* 不一样的包中能够有同名的类
* 经过包能够实现对类的访问控制
* Java中**package**关键字标识当前编译单元所属的包
* Java中用**import**关键字引入包
* 在Java5中容许使用import static 来导入类的常量和静态方法,这样在使用时就不须要加类名前缀了
四、Java编译单元(源文件)
* java编译单元能够包含一个package语句,多个import语句以及类、接口和枚举定义
* 一个编译单元只能有一个public类,而且该类名必须和源文件的主文件名必须和该类类名相同
五、类的继承和多态
5.一、类的继承和方法覆盖
* 继承是对父类的扩展,子类经过继承得到父类属性和方法
* Java中只有单继承,A extends b 将a声明为b的直接子类
* 子类能够在类体中重写(覆盖)继承自父类的方法,用@Override注解来避免写错方法头
* 子类覆盖父类方法被访问的权限不能比父类高
* 类的被访问权限高到低 private>缺省>protected>public
* private方法不能覆盖!,若是在子类中定义了一个方法在父类中是private修饰的,那么这两个方法无关
* 父类中的static方法能够被继承,但不能被覆盖,若是子类中定义了相同的static方法,那么该父类方法会被隐藏,但使用父类.方法名仍然可使用
* 方法的重载和方法的覆盖的区别
*方法重载是在同一个类中定义多个名称相同而参数不一样的方法,而方法的覆盖是在子类中对继承自父类的方法提供一种不一样的实现,方法头、参数、返回值都是和父类相同的
* super关键字用来引用当前对象的父类对象
* 在子类中调用父类的构造方法super(参数列表);
* 在子类中访问父类中被隐藏的对象super.variableName;
* 在子类中访问父类中被覆盖的方法super.methodName(参数列表)
* 不能用super调用间接父类的构造方法,super.super();是不合法的
* 能够在构造方法中用this调用本类的其余构造方法this.构造方法(参数列表);
* 在构造方法中使用this调用本类的其余构造方法和super调用父类构造方法都只能是方法的第一条语句且只能有一条语句,因此两者不能在一个构造方法中
* 建立子类对象时候,系统首先调用全部父类的构造方法,包括全部类的根类Object
5.二、封装性和访问修饰符
* 类(包括接口、枚举)的访问权限`
* public:能够被任何其余类使用
* 缺省访问修饰符(不写):只能被同一包内的类使用
* 类的成员变量访问权限(在类中建立该类实例.访问)
* private 只能被类自己访问,外界只能经过该类提供的接口访问
* 缺省 同一包内的类能够访问
* protected 能够被统一包内的类和其子类访问
* public 能够被任何类访问
* final修饰符的做用
* final修饰类,该类就会成为最终类,不能被继承
* final修饰方法,该方法就不能被子类覆盖
* final修饰变量,该变量变为常量,一经赋值不能更改
* final修饰参数,则该参数在方法中只能使用但不能被改变
* final修饰一个引用变量,表示该变量的引用(地址)不能改变,即不能使用该变量指向另外一个对象,但对象自己能够改变
* 成员变量通常和static修饰符连用,构成编译时常量,编译器将该常量值代入任何可能使用到它的表达式中,以减轻运行时的负担
5.三、抽象类
* 抽象类是用关键字abstract修饰的类,其中能够定义抽象方法,抽象方法也使用abstract修饰,只有声明没有具体的实现
* 抽象类不能实例化,但能够被声明;抽象类的子类须要实现抽象类中的全部方法,除非子类自己也是抽象类。
* 抽象类中能够定义非抽象方法,甚至能够没有抽象方法,但即便没有抽象方法,它仍是要被一个非抽象子类继承才可使用
* abstract 类必须被继承才有意义,而final修饰的类不能被继承,因此这两个关键字不能再定义类的时候同时使用
* abstract类中有构造方法
* 对象的转换和多态
* 继承关系使子类继承了父类的特性,而且能够扩展一些新的特性,子类是父类的特殊化,子类和父类的关系是(is a)关系,子类 is a 父类
* 子类对象和父类对象在必定条件下也能够互相转换
* 子类能够自由转换成父类对象但要损失子类自己扩展的特性
* 父类对象转换子类对象须要强制类型转换,但在转换以前要使用instanceof运算符判断它指向的是否是要转换的子类类型的对象,不然容易出现类转换异ClassCastException
* instanceof运算符 对象 instanceof 类名 判断这个对象是否是该类的实例
5.四、多态
* 多态就是多种形式,指Java程序中一个类或多个类中能够定义多个同名的方法,这多个同名的方法能够完成不一样的操做
* 多态性是指在程序运行时判断应该执行哪一个方法代码的能力
* 多态分为静态多态(编译时多态)和动态多态(运行时多态),前者经过方法重载实现,后者经过方法覆盖实现
* 绑定:方法调用和方法体的关联过程
* 前期绑定:程序执行前绑定
* 后期绑定:程序执行时绑定
* Java中除了用static和final修饰的方法外,其他都是后期绑定(动态绑定)
* 动态多态实现机制:方法的动态绑定
* 对于重载的方法,在运行时根据传递的参数来绑定方法体
* 在父类中声明的方法被子类继承,若是该方法被子类覆盖,在子类调用该方法时会绑定子类覆盖的方法体;
* 若是子类没有覆盖该方法,则经过子类调用该方法时绑定父类原有方法体
* 若是一个方法中的参数是父类,那么该方法的参数能够传递该父类的任意子类对象