Java面向对象基础总结
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修饰的方法外,其余都是后期绑定(动态绑定) * 动态多态实现机制:方法的动态绑定 * 对于重载的方法,在运行时根据传递的参数来绑定方法体 * 在父类中声明的方法被子类继承,如果该方法被子类覆盖,在子类调用该方法时会绑定子类覆盖的方法体; * 如果子类没有覆盖该方法,则通过子类调用该方法时绑定父类原有方法体 * 如果一个方法中的参数是父类,那么该方法的参数可以传递该父类的任意子类对象
赞 (0)