原文地址:https://www.cnblogs.com/xugf/p/8475931.html
java是面向对象的高级语言,类和对象是java对象的核心构成,围绕java类和java对象,主要有3大基本特性:封装、继承、多态,封装是java类的编写规范,继承是类和类之间联系的一种形式,而多态未系统组件和模块之间提供了解决方案。
本文主要围绕3大特性介绍java面向对象、组建解耦的核心思想。
1、面对对象思想
面对对象是当今主流的编程思想,已经取代了过程化程序开发技术,java是完全面向对象编程语言,所以必须熟悉面向对象才能编写java程序。
面向对象的程序核心是由对象组成的,每个对象包含对外公开的特定功能和隐藏的实现部分,程序中的很多对象来自jdk库,而更多是由程序员自定义的。
从理论上讲,只要对象能实现业务功能,其具体的实现细节不必关心。
面向对象由一下特点:
(1)、面向对象是一种常见的思想,比较符合人们的思想习惯。
(2)、面向对象能将复杂的业务逻辑简单化,增加代码复用性。
(3)、面对对象有抽象、封装、继承、多态等特性。
面向对象的语言有 c++ 、java、c#等
2、类和对象的关系
类:对某项事物的普遍一致性特征、功能的抽象、描述和封装,是构成对象的模板,用java编写的代码都会在类的内部。类之间的关系有依赖、聚合、继承等关系
对象:使用new关键字或反射技术创建的某个类的实例。用一个类的所有对象,都具有相似的数据和行为,但每个对象都保存自己独特的状态,对象状态会随着程序的运行发生改变,状态的变化必须调用相应的方法来改变,这就是封装的思想。
3、封装思想
核心思想是隐藏细节、数据安全:将对象不需要外界访问的成员变量和方法私有化,只提供符合开发者思想意愿的公有方法来访问这些数据和逻辑,保证数据的安全和程序的稳定。
具体的实现方式就是:
使用private修饰关键字把成员变量设置为私有,防止外部程序直接随意调用和修改成员变量,然后提供公共的set和get方法设置和获取成员变量的值。也可以把只在本类内部使用的方法使用private,这就是封装的思想,是面向对象最基本的开发规范之一。
说下java的访问修饰关键字,java有4中访问修饰关键字:public、private、protectd和默认权限四种。
public :具有最大的访问权限,可以访问任何一个在classpath下的类。
protected:主要是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
default:本包的类可以访问,
private:访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是用private修饰。
java的访问控制是在编译层的,只在编译时进行访问权限检查,不会在类文件中留下痕迹。
通过反射机制,还是可以访问类的私有成员变量的。
在实际开发中,这样的封装方式已经成为java bean代码编写的规范。主流的反射框架也是采用set和get为对象赋值取值,而不是直接操作对象的值。
4继承和类的实例化过程
(1)在多个不同类中抽取共性的数据和逻辑,对这些共性的内容进行封装成一个新的类即父类(也叫超类、父类),让之前的 类继承这个类,子类中就不必重复定义共性的内容。
(2)java的继承是单继承,只能继承一个类。
(3)如果子类和父类有同名的成员变量或方法,可以使用super关键字调用父类的成员变量和方法,前提是成员变量在子类张 可见。
(4)在调用子类的构造方法时,会隐式的调用父类的构造方法super(),如果父类没有无参构造方法,为了避免编译错误, 需要在子类的构造方法中显式的调用父类的含参构造方法。
(5)子类创建时调用父类的构造方法:子类需要使用父类的成员变量和方法,所以要引用父类的构造方法来初始化,之后 才进行子类的成员变量和方法的私有化,因此构造方法时无法覆盖的。
(6)当子类需要扩展父类的某个方法时可以覆盖父类的方法,但子类的访问权限必须大于或等于父类的访问权限。
(7)继承提高了程序的复用性、扩展性,也是java多态特征的前提。
(8)在实际开发中,并非先有父类,而是先有子类中通用的数据和逻辑,然后抽取封装出来的父类。
类的实例化过程
(1)jvm读取指定classpath下的class文件,加载到内存,如果后直接父类,也会加载父类。
(2)堆内存分配空间
(3)执行父类子类静态代码块
(4)对象属性进行初始化
(5)调用构造方法
(6)在构造方法中,先调用父类构造方法初始化父类数据。
(7)初始化父类中数据后,执行子类的构造代码块。
(8)执行子类构造方法中的特定初始化。
(9)初始化完成后,将地址赋值给引用。
5 多态、反射和组件解耦
多态类允许不同类的对象对同一“消息”做出响应。即同一消息可以根据对象的不同而采用多种不同的行为方式,用于消除类型之间的耦合关系,spring的核心就是多态和面向接口编程。
(1)java中可以使用父类、接口变量引用子类、实现类对象。
(2)在这个过程中,会对子类、实现类对象做自动类型提升,其特有功能就无法访问了,如果需要使用,可以常采用强制类型 转换
java的反射技术和多态特性是框架开发组件解耦的核心,spring的ioc和di提供了一个很好的范例,spring的ioc使用反射技术创建管理对象,di使用多态为组件注入依赖对象。
在学习spring之前,简单的解决方案是使用一个.properties文件保存程序中所有接口、实现类类型键值信息,然后在程序中使用一个全局properties对象保存这些信息,并且使用反射技术把这些实现类初始化、提供一个静态的方法获取接口的实现类对象,在组件中就可以使用依赖对象的键获取需要的对象。
这样的方案带来的好处就是:当我们需要修改某个组件的实现方式时,比如把之前的jdbc的dao实现改为hibernate实现,只需要把新的实现类放到classpath下,把.properties中文件对应接口的实现类类型改为新的hibernate类型,不需要修改依赖组件的代码
原文地址:https://www.cnblogs.com/xugf/p/8475931.html