JAVA面向对象的三大特性
每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。下面是小编整理的关于JAVA面向对象的三大特性,希望大家认真阅读!
封装性
理解封装性概念
封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序(方法)和数据(属性)都不受外部干扰且不被误用。
理解封装性的一个方法就是把它想成一个黑匣子,它可以阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问通过一个适当定义的接口严格控制。
如果想与现实生活中的某个事物作对比,可考虑汽车上的自动传送。自动传送中包含了有关引擎的数百比特的信息,例如你正在以什么样的加速度前进,你行驶路面的坡度如何,以及目前的档位。作为用户,你影响这个复杂封装的方法仅有一个:移动档位传动杆。例如,你不能通过使用拐弯信号或挡风玻璃擦拭器影响传动。所以档位传动杆是把你和传动连接起来的惟一接口。此外,传动对象内的任何操作都不会影响到外部对象,例如,档位传动装置不会打开车前灯!因为自动传动被封装起来了,所以任何一家汽车制造商都可以选择一种适合自己的方式来实现它。然而,从司机的观点来看,它们的用途都是一样的。与此相同的观点能被用于编程。封装代码的好处是每个人都知道怎么访问它,但却不必考虑它的内部实现细节,也不必害怕使用不当会带来负面影响。
java封装的对象
Java封装的基本单元是类。一个类定义了将被许多对象共享的属性和行为方法。这个类的每个对象都包含这个类定义的行为和属性,好像它们是从同一个类的模子中铸造出来似的。因为这个原因,对象被看作是类的实例,可以说类是实例对象的模板。所以,类是一种逻辑结构,而对象是真正存在的物理实体。
当创建一个类时,你要指定组成这个类的属性和方法。在用Java编写的程序中,方法定义如何使用成员变量。这意味着一个类的行为和接口是通过方法来定义的,类的这些方法对它的实例数据进行操作。
访问权限
封装:隐藏对象的属性和实现细节,仅对外公开接口。
(1)private(私有变量):只能被定义它的类访问。
(2)protected(受保护变量):可以被定义它的类及子孙类直接访问,也可以由同一包中的其他类直接访问。
(3)public(公共变量):可以被任何类进行访问。
(4)package:可以被定义它的类和同一个包中的其他类(包括派生子类)所访问.(包变量在声明时常常省略package关键字),在其他包中的子类则不能访问父类的包变量
既然类的目的是封装复杂性,在类的内部就应该有隐藏实现复杂性机制。类中的每个方法或变量都可以被标记为私有(private)或公共(public)。类的公共接口代表类的外部用户需要知道或可以知道的每件事情;私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有的方法或变量。既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,那么你就能保证不希望发生的事情就一定不会发生。
继承性
理解继承性概念
继承是一个对象获得另一个对象的属性的过程。
继承很重要,因为它支持了按层分类的概念。例如,尊贵的猎犬是狗类的一部分,狗又是哺乳动物类的一部分,哺乳动物类又是动物类的一部分。如果不使用层级的概念,我们就不得不分别定义每个动物的所有属性。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那儿继承所有的通用属性。所以,可以这样说,正是继承机制使一个对象成为一个更具通用类的一个特定实例成为可能。下面让我们更具体地讨论这个过程。
一个深度继承的子类继承了类层级中它的每个祖先的所有属性。继承性与封装性相互作用。如果一个给定的类封装了一些属性,那么它的任何子类将具有同样的属性,而且还添加了子类自己特有的属性。新的子类继承它的所有祖先的所有属性。
(1)复用其他对象的代码有两种方法:
①. 继承:是由子对象完全继承父对象的数据和操作,”is”的关系。
②. 包含:把一个对象作为另外一个对象的一部分,从而达到复用的目的,”has”的关系。
(2)继承的理解:
①. 继承是类实现可重用性和可扩充性的关键特征,在继承关系下类之间组成网状的层次结构。
②. 继承避免公用代码的重复开发,减少代码的冗余。
③. 通过继承增强一致性,从而减少模块间的接口和界面
(3)单继承(Java支持):
子类只能有一个直接父类,多继承(Java不支持):子类可以有多个直接父类。
Java不支持类的多继承,但支持接口的多继承。继承通过关键字extends实现。
(4)变量隐藏:
在子类对父类的继承中,如果子类与父类的成员变量同名,此时成为子类隐藏(override)了父类的成员变量。子类若要引用父类的同名变量,要用super关键字做前缀加圆点操作符引用,即“super.变量名”。
(5)方法覆盖:
在子类中重写父类的方法,它们的名称,参数以及返回类型完全相同。通过改写方法体来完成不同的功能。注意子类方法不能缩小父类方法的访问权限 。
(6)super关键字:
如果子类调用父类的构造函数,则通过super()调用来实现。如果子类调用父类的同名方法,则通过super.方法名()来实现。
(7)this关键字: