面向对象的三大特性分别是:封装、继承和多态。
封装
封装,即在对外部隐藏对象的属性和实现的细节,仅仅给其他的类提供公开的访问方法。在类中用private来实现封装。
举例:
class A{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
类A中的name属性是私有的别的类无法直接调用,但是可以通过setName和getName来调用name属性。
封装的优点
- 用private将类的细节和外界隔离开,从而实现属性和方法的隐藏,而要访问这些属性和方法的途径就是通过类本身,提高了数据的安全性。
- 通过隐藏隔离,只允许外部对类做有限的访问,开发者可以自由的改变类的内部实现,而无需改变使用该类的方法。
- 提高了代码的复用性,封装成工具类后能够减少很多繁琐的步骤。
继承
继承,即类A可以不用重新编写类B中的属性和方法就可以实现对类B的代码的重用,并能扩展新的属性和方法。类B就称为“基类”或者“父类”;类A称为“子类”。子类可以直接调用父类中的方法。
继承形式:【访问权限修饰符】+【修饰符】+class+子类名+extends+父类名
继承中构造方法
- 子类构造方法总是先调用父类构造方法。必须将调用父类构造方法的这条语句放在子类构造方法的第一条语句位置。如果第一条语句没有调用父类的构造方法,系统将会自动地在这个位置上插入一条调用父类默认构造方法的语句。
- 默认情况下,调用父类无参构造方法。由于默认的构造方法不带参数,所以,如果在父类中定义了带参数的构造方法,而没有定义不带参数的构造方法将会出现编译错误;父类中那些带参数的构造方法,子类将不会自动地调用它们,必须人工地将调用它们的语句写入子类的构造方法中。
- 可以在子类使用super关键字调用父类任意一个构造方法,super关键字必须放在第一行。
继承中的this关键字
- 在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
- 在一个类的构造方法内部,也可以使用this关键字引用其它的构造方法,这样可以降低代码的重复,也可以使所有的构造方法保持统一,这样方便以后的代码修改和维护,也方便代码的阅读。
- 在一个类的内部,也可以使用this代表自身类的对象,或者换句话说,每个类内部都有一个隐含的成员变量,该成员变量的类型是该类的类型,该成员变量的名称是this
- 在一个类的内部,成员方法之间的互相调用时也可以使用“this.方法名(参数)”来进行引用
继承中的super关键字
- 在子类构造方法中要调用父类的构造方法,需要注意:super语句只能出现在子类构造方法体的第一行。
- 当子类方法体中的局部变量或者子类的成员变量与父类成员变量同名时,即子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。
- 当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
- 与this的区别,this通常指代当前对象,super通常指代父类。
方法覆盖(override)
- 定义:子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
- 方法覆盖的原则
- 同名
- 同参
- 同返回值
- 访问权限不能缩小
多态
多态是指一个方法只能有一个名称,但可以有许多形态,或者可以理解为”一个接口,多个方法”。
多态存在的条件:在继承条件下,父类引用指向子类对象,要有重写。
运行期类型和编译期类型(Animal animal=new Cat())
- 运行期类型是Cat,编译期类型是Animal
- 编译时,会在Animal中检查是否有相应的属性和方法
- 运行时,执行Cat中实现的方法
多态环境下的属性和方法
- 针对属性,运行期使用的是父类的属性
- 针对静态方法,运行期调用的是父类的静态方法
- 针对成员方法,运行期调用的是父类的成员方法
多态参数
方法的参数为父类或者接口时,可以传入父类及其子类或者接口的实现类
多态的优点
- 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
- 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。