编程体系结构(06):Java面向对象
一、基础概念
1、面向对象概念
面向对象编程的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。
2、类和对象
对象:真实存在唯一的事物;在应用程序中对象是数据和动作的结合体,不仅能够进行操作,同时还能够记录下操作结果。
类:抽象的概念,实际就是对某种类型事物的共性属性与行为的抽取;例如User[名称.年龄.性别]类用来描述用户的基础信息。
Java开发中如何理解面向对象:构建合适的对象接口API体系,创建合适的对象,解决合适的问题,例如JDK的API已经定义好的类,通过这些类创建对象直接使用;通过自定义类来创建对象使用,在MVC中模式中,不同业务功能创建不同的接口和类系统。
3、属性和方法
类中变量
位置区别:
- 成员变量是定义在方法之外,类内;
- 局部变量是定义在方法之内。
作用区别:
- 成员变量的作用是用于描述一类事物的公共属性的。
- 局部变量的作用就是提供一个变量给方法内部使用而已。
初始值区别:
- 成员变量是有默认的初始值。
- 局部变量是没有默认的初始值的,必须要先初始化才能使用。
生命周期:
- 随着对象的创建而存在,随着对象的消失而消失。
- 局部变量在调用了对应的方法时执行到了创建该变量的语句时存在,局部变量一旦出了自己的作用域那么马上从内存中消失。
类中方法
对一个类功能的具体描述,可能是类方法或者对象方法;
- 类方法,又叫静态方法,使用类直接调用,常用工具类;
- 对象方法,又叫实例方法,使用类对象调用,常见API方法;
构造方法
构造函数的作用是用来给对应的对象进行初始化处理,没有返回值类型的,构造函数的函数名必须要与类名一致,如果一个类没有显式的声明一个构造方法,那么java编译器会为该类添加一个无参的构造函数的,如果一个类已经显式的写上一个构造方法时,那么java编译器则不会再为该类添加一个无参的构造方法,构造函数是可以在一个类中以重载的形式存在多个。
4、接口
接口是一个特殊的类,接口的成员变量默认的修饰符为:public-static-final,接口中的方法都是抽象的方法,默认的修饰符:public-abstract,接口不能创建对象且没有构造方法的,接口是给类去实现时使用的,非抽象类实现接口,必须要把接口中所有方法全部实现。
接口的作用:程序的解耦,定义实现类的约束规范,如果需要拓展特别功能,也可以基于接口形式实现。
类与接口之间关系:多实现关系;接口与接口之间关系:多继承关系。
5、重载与重写
方法重写
父类的功能无法满足子类的需求时,可以进行方法的重写即子父类使用同名的函数,且子类重写的方法使用@Override注解,这里存在继承的关系。
- 方法名与形参列表必须一致;
- 子类的权限修饰符必须要大于或者等于父类的权限修饰符;
- 子类的返回值类型必须要小于或者等于父类的返回值类型;
- 子类抛出的异常类型要小于或者等于父类抛出的异常类型;
方法重载
在一个类中存在两个或者两个以上的同名函数,称作为方法重载,函数名要一致,形参列表不一致(形参的个数或形参的类型不一致)。
6、包与权限
权限修饰符
权限修饰符就是控制被修饰的成员的范围可见性,分为:public、private、protected、default(没有修饰)。在不同包下面只有public 与 protected 可以访问,而且protected必须是在继承关系下才能够访问。
包package
包可以理解为计算机系统中的文件夹,用来解决类名重复产生冲突的问题,包名全部小写,语句必须位于java文件中中第一个语句。
二、基本特征
封装
把类中内部的实现细节进行隐藏,只暴露对外的接口,例如实际开发场景中一般实体类的所有成员属性(成员变量)都要封装起来,可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问,适当的封装可以让程序代码更容易理解与维护,加强安全性。
继承
在现有父类的基础上在重新构建一个新类即子类,通过子类对象可以访问父类非私有的成员变量和成员方法,以及重写父类中的非私有成员方法,继承的作用就是能提高代码的复用性。
多态
多态指一个对象可以具备多种形态,例如:父类的引用类型变量指向了子类的对象;接口的引用类型变量指向了接口实现类的对象;这种情况是存在于继承或者实现关系中,多态情况下,子父类存在同名的成员变量时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
三、常用关键字
1、This关键字
this关键字代表了所属函数的调用者对象,如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据,在一个构造函数中可以调用另外一个构造函数初始化对象。
2、Static关键字
static修饰成员变量:如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
static修饰成员函数:该静态方法不依赖于任何对象就可以进行访问,非静态成员方法/变量都必须依赖具体的对象才能够被调用。
static修饰代码块:static关键字用来包装静态代码块以提升程序性能,静态代码块可以置于类中的任何地方,在类初次被加载的时候,会依次执行一次每个静态代码块。
3、Super关键字
super关键字代表了父类空间的引用,子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
4、Instanceof关键字
instanceof关键字的作用:判断一个对象是否属于指定的类别,对象与指定的类别必须要存在继承或者实现的关系。在强制类型转换之前通常会使用该关键字先判断,然后在进行转换。
5、Final关键字
final修饰类:表明该类不能被继承,final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
final修饰方法:锁定方法防止任何继承类修改它的含义;第二个原因是效率,父类的final方法是不能被子类所覆盖的。
final修饰变量:成员变量被标识为常量,只能被赋值一次,赋值后值不再改变,当函数的参数类型声明为final时,说明该参数是只读型的。
6、Abstract关键字
abstract修饰类:该抽象类不能被实例化,抽象类与接口的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类中可以有实例方法,并实现业务逻辑,抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承,而对于抽象类来说就是需要通过继承去实现抽象方法。
abstract修饰方法:抽象方法没有方法主体,与接口方法有点类似,抽象方法不能用private修饰,因为抽象方法必须被子类实现,抽象方法也不能用static修饰,抽象类.抽象方法这样的操作没有意义。
四、场景分析
1、设计模式
面向对象与设计模式是之前几年很火热的概念,面试时必问的问题,在编程中想用好设计模式,前提理解面向对象机制,都是对问题的高度向上抽象封装,向下逐层解决实现,提高代码的复用性、可读性、灵活性、可维护性强,最主要是格调高。
2、IO流体系
如果想理解面向对象和设计模式的代码,在Java中可以重点读读IO流体系的API,顶级接口,向下实现,包装类,扩展类,是真的把这两大理念用到极致了,当然IO流最为文件处理的核心,也值得读读源码。
3、MVC开发模式
在MVC的开发模式中,业务层接口,业务层实现;数据库接口,数据访问实现,也是面向对象的最基础用法接口与接口的实现类。