一、面向对象
Java是面向对象的高级编程语言,类和对象是Java程序的构成核心。围绕Java类和Java对象,有三大基本特征:
1、封装是Java类的编写规范;
2、继承是类与类之间联系的一种形式;
3、多态为系统组件或模块之间解耦提供了解决方案。
面向对象的程序核心是由对象组成的,每个对象包含着对用户公开的特定功能和隐藏的实现部分。程序中的很多对象来自JDK标准库,而更多的类需要我程序员自定义。从理论上讲,只要对象能够实现业务功能,其具体的实现细节不必特别关心。
面向对象有以下特点:
(1)面向对象是一种常见的思想,比较符合人们的思考习惯;
(2)面向对象可以将复杂的业务逻辑简单化,增强代码复用性;
(3)面向对象具有抽象、封装、继承、多态等特性。
二、面向对象的特性:
1、封装
隐藏不需要对外公开的属性和方法,以减少对外耦合;而外部只能通过方法来控制成员变量的操作,可提高代码的安全性;同时把代码用方法进行封装,提高了代码的复用性。
良好的封装所具有的的优点:
(1)隐藏信息和细节,提高安全性;
(2)良好的封装可以减少耦合性,提高复用性;
(3)对类内部结构可以随意修改,只要保证公有接口始终返回正确的结果即可。
2、继承
多个类共同的成员变量和成员方法,抽取到另外一个类中(父类),在让多个类去继承这个父类。特点:
(1)子类继承父类的成员变量:
当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量,具体的原则如下:
1)能够访问父类的public和protected成员变量;不能够访问父类的private成员变量(可以通过反射强制获取);
2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量,如果在子类中出现了同名的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。
(2)子类继承父类的方法
1)能够访问父类的public和protected成员方法;不能够访问父类的private成员方法(但是能继承;
2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法(但是父类的成员方法如果是静态,子类也必须是静态才能屏蔽,不然编译错误,反之亦然)。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
(3)构造器
子类是不能够继承父类的构造器,但是要注意的是,如果父类是有参构造,那么子类必须有同类型参数构造,如果父类是无参构造,那么子类任意构造都可以。
继承存在的缺陷:
(1)继承是一种强耦合关系,子类会由于父类的改变而改变;
(2)继承破坏了封装的特性,对于父类而言,它的实现和细节对于子类来说都是透明的。
3、多态
父类的引用指向子类对象:父类类型 引用名称=new 子类类型
父类类型 引用名称=(父类类型 引用名称)new 子类类型
(1)多态成员变量
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量;
运行时期:也是调用引用型变量所属的类中的成员变量;
简单记:编译和运行都参考等号的左边。
(2)多态成员方法
编译时期:参考引用变量所属的类,如果没有类中没有调用的方法,编译失败;
运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法;
简而言之:编译看左边(父类是否拥有该方法),运行看右边(静态都看左边)。
多态的转型分为向上转型与向下转型两种:
(1)向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
使用格式:父类类型 变量名=new 子类类型();
(2)向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的。
使用格式:子类类型 变量名=(子类类型)父类类型的变量;
(3)转化异常:Java虚拟机的转化机制无法判断数据内部元素的类型,故不可强制为Object。
多态的好处:
(1)可替换性。多态对已存在的代码具有可替代性;
(2)可扩充性。新增加的子类不影响已经存在的类结构;
(3)接口性。多态是父类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的;
(4)灵活性;
(5)简化性。
Java中多态的体现:
(1)重写(覆盖)
(2)动态链接(动态调用)
(3)重载
多态的三个必要条件:
继承
重写
向上转型
多态的作用:
封装可以隐藏细节,使得代码模块化;继承可以扩展已存在的模块化代码(父类),实现代码的复用。而多态,则实现了接口的复用,多态的作用,就是在类的实现和派生的时候,保证使用基类下面,任意一个子类实例的属性和方法,都可以正确调用。