Java面向对象基础总结

时间:2020-11-16 01:33:00 来源:互联网 作者: 神秘的大神 字体:

面向对象基本思想

1、OO概述

1.1、面向过程和面向对象的比较

* 对于一个问题的解决,面向过程,需要考虑其每一步的实现,不适合处理复杂的问题;
* 面向对象思想是一种分类的思维模式,即思考一个问题需要哪些分类,然后对分类进行单独的思考,最后才会对某个分类下的细节进行面向过程的思索;
*  面向对象更适合处理复杂的问题,适合处理需要多人协作的问题;
* 对于描述复杂的事物,需要用面向对象的思想去宏观上分析整个系统,但在具体的微观操作的设计上,依旧需要使用面向过程思想去处理;

1.2、面向对象编程

以类的方式组织代码,以对象的方式封装数据;

1.3、面向对象的三大特征

* 封装:对数据进行封装,然后,对外提供一个操作数据的接口,使外界只能通过这些特定接口去访问数据,赋予了对象“黑盒”的特性
* 继承:是一个对象获取另一个对象属性的过程
* 多态:一个程序中相同名字的方法表示不同含义的情况,方法的重载是静态多态,方法的覆盖是动态多态

1.4、类和对象的理解

*  抽象:从众多的事物中抽取出共同的特征
*  对象是具体的事物,类是对对象的抽象
* 对象是现实世界中明确标识的实体,每个对象都有自己独特的状态行为和标识
* 对象的状态: 也称为对象的特征和属性,是由当前数据域的值决定的
* 对象的行为:也称为动作,是由对象中的方法决定的
* 对象标识:类是对象的模板,对象是类的实例,可以以一个类为模板创建多个对象(实例化),对象的标识用来区分这些对象
* 当一个对象使用完毕,不在被引用时,就会被垃圾回收器(gc)回收

1.5、OOP的优势

* 易维护
* 可重用
* 可扩展

1.6、面向对象(OO)的三大领域

* 面向对象分析(OOA)
* 面向对象设计(OOD)
* 面向对象编程(OOP)

2、变量的作用域和生存期

1.1、变量作用域

* 变量的作用域变量可以在程序的什么范围内可以使用
* Java程序中作用域是通过块来实现的(Java中的大括号)
* 变量在哪个块中被声明,它的作用域就在哪一个块

2.2、变量的生存期:

* 变量的生存期是对象被分配内存内存的时间期限
* 对于局部变量(基本类型),在声明时系统为该变量分配内存,当方法返回时,该变量从内存栈中清除
* 对于对象:在new创建对象时,系统将在堆中为它分配内存,当它不在被引用时,在之后的某一时刻,垃圾回收器运行时才能被回收

3、包机制

* 包是对类的封装,以一组相关类或者接口的集合
* 不同的包中可以有同名的类
* 通过包可以实现对类的访问控制
* Java中**package**关键字标识当前编译单元所属的包
* Java中用**import**关键字引入包
* 在Java5中允许使用import static 来导入类的常量和静态方法,这样在使用时就不需要加类名前缀了

4、Java编译单元(源文件)

* java编译单元可以包含一个package语句,多个import语句以及类、接口和枚举定义
* 一个编译单元只能有一个public类,并且该类名必须和源文件的主文件名必须和该类类名相同

5、类的继承和多态

5.1、类的继承和方法覆盖

* 继承是对父类的扩展,子类通过继承获得父类属性和方法
* 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.2、封装性和访问修饰符

* 类(包括接口、枚举)的访问权限`
    * public:可以被任何其他类使用
    * 缺省访问修饰符(不写):只能被同一包内的类使用

* 类的成员变量访问权限(在类中创建该类实例.访问)
    * private     只能被类本身访问,外界只能通过该类提供的接口访问
    * 缺省         同一包内的类可以访问
    * protected   可以被统一包内的类和其子类访问
    * public      可以被任何类访问
  
* final修饰符的作用
    * final修饰类,该类就会成为最终类,不能被继承
    * final修饰方法,该方法就不能被子类覆盖
    * final修饰变量,该变量变为常量,一经赋值不能更改
    * final修饰参数,则该参数在方法中只能使用但不能被改变
    * final修饰一个引用变量,表示该变量的引用(地址)不能改变,即不能使用该变量指向另一个对象,但对象本身可以改变
  	* 成员变量一般和static修饰符连用,构成编译时常量,编译器将该常量值代入任何可能使用到它的表达式中,以减轻运行时的负担

5.3、抽象类

* 抽象类是用关键字abstract修饰的类,其中可以定义抽象方法,抽象方法也使用abstract修饰,只有声明没有具体的实现
* 抽象类不能实例化,但可以被声明;抽象类的子类需要实现抽象类中的所有方法,除非子类本身也是抽象类。
* 抽象类中可以定义非抽象方法,甚至可以没有抽象方法,但即使没有抽象方法,它还是要被一个非抽象子类继承才可以使用
* abstract 类必须被继承才有意义,而final修饰的类不能被继承,所以这两个关键字不能再定义类的时候同时使用
* abstract类中有构造方法
* 对象的转换和多态
	* 继承关系使子类继承了父类的特性,并且可以扩展一些新的特性,子类是父类的特殊化,子类和父类的关系是(is a)关系,子类 is a 父类
    * 子类对象和父类对象在一定条件下也可以互相转换
        * 子类可以自由转换成父类对象但要损失子类本身扩展的特性
        * 父类对象转换子类对象需要强制类型转换,但在转换之前要使用instanceof运算符判断它指向的是不是要转换的子类类型的对象,否则容易出现类转换异ClassCastException
        * instanceof运算符 对象 instanceof 类名 判断这个对象是不是该类的实例

5.4、多态

* 多态就是多种形式,指Java程序中一个类或多个类中可以定义多个同名的方法,这多个同名的方法可以完成不同的操作
* 多态性是指在程序运行时判断应该执行哪个方法代码的能力
* 多态分为静态多态(编译时多态)和动态多态(运行时多态),前者通过方法重载实现,后者通过方法覆盖实现
* 绑定:方法调用和方法体的关联过程
	* 前期绑定:程序执行前绑定
    * 后期绑定:程序执行时绑定
	* Java中除了用static和final修饰的方法外,其余都是后期绑定(动态绑定)
* 动态多态实现机制:方法的动态绑定
	* 对于重载的方法,在运行时根据传递的参数来绑定方法体
    * 在父类中声明的方法被子类继承,如果该方法被子类覆盖,在子类调用该方法时会绑定子类覆盖的方法体;
    * 如果子类没有覆盖该方法,则通过子类调用该方法时绑定父类原有方法体
    * 如果一个方法中的参数是父类,那么该方法的参数可以传递该父类的任意子类对象