利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。 数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节, 只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节, 但可以通过对象对外提供的接口来访问该对象。
2.优点- 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
- 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影 响其他模块
- 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能
- 提高软件的可重用性
- 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的
| 区别 | 成员变量 | 局部变量 |
|---|---|---|
| 在类中位置不同 | 类中方法外 | 方法内或者方法声明上 |
| 在内存中位置不同 | 堆内存 | 栈内存 |
| 声明周期不同 | 随着对象存在而存在,随着对象消失而消失 | 随着方法调用而存在,随着方法调用完毕而消失 |
| 初始化值不同 | 有默认的初始值 | 没有默认的初始值,必须先定义,赋值,才能使用 |
| 区别 | 静态变量 | 成员变量 |
|---|---|---|
| 所属不同 | 属于类,所以也称为类变量 | 属于对象,所以也称为实例变量(对象变量) |
| 在内存中位置不同 | 存储于方法区的静态区 | 存储于堆内存 |
| 内存中出现时间不同 | 随着类存在而存在,随着类消失而消失 | 随着对象创建而存在,随着对象消失而消失 |
| 调用不同 | 可以通过类名调用,也可以通过对象调用 | 只能通过的对象来调用 |
- 静态代码块:在类加载的时候就执行,且执行一次。一般用于对对象进行初始化。
- 构造代码块:每次调用构造方法都执行且在构造方法之前执行。一般是对类进行初始化。
继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型 。
- 提高了代码的复用性
- 提高了代码的维护性
- 在类与之间产生了关系,是多态的前提
- Java只支持单继承,不支持多继承
- Java支持多层继承
- 子类只能只能继承父类所有非私有成员(成员方法和成员变量)
- 子类不能继承父类的构造方法,但是可以通过super关键在去访问父类构造方法
- 不要为了部分功能而去继承
- 继承中类之间体现的是“is a”的关系。
- 子类中成员变量和父类中成员变量名称不同。
- 子类中成员变量和父类中成员变量名称相同。
- 在子类方法中的查找顺序:
在子类方法的局部范围找,有就使用
在子类的成员范围找,有就使用 - 在父类的成员范围找,有就使用
如果还找不到,就报错
- 子类中所有的构造方法默认会都会访问父类中空参数的构造方法
- 原因:因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前, 一定要完成父类数据的初始化。
- 每一个子类的构造方法第一条语句默认是:super();
- 如果父类中没有无参构造方法,该怎么办呢?
- 方式一:子类通过super去显示调用父类其他的带参的构造方法
- 方式二:子类通过this去调用本类的其他构造方法 (子类一定要有一个去访问父类的构造方法,否则父类数据就没有初始化)
一个类的成员变量的初始化:
-
默认初始化
-
显式初始化
-
-
构造方法初始化
- 子类的初始化(分层初始化)
- 先进行父类的初始化,再进行子类的初始化
-
父类中私有成员方法不能被重写(因为父类中私有成员方法不能被继承)
-
子类重写父类中方法时,访问权限不能更低(最好一致)
-
父类是静态方法时,子类也必须通过静态方法进行重写。
-
子类和父类的声明最好一模一样。
final关键字是最终的意思,可以修饰类,修饰变量,修饰成员方法
- 修饰类:不能被继承
- 修饰变量:变量就变成了常量,只能被赋值一次
- 修饰方法:方法不能被重写
注意:
final修饰局部变量
在方法内部,该变量不可以被改变
在方法声明上,分为基本类型和引用类型的情况
(1)基本类型:是值不能变
(2)引用类型:是地址不能变,但是该对象的堆内存中的值是可以改变的
final修饰变量的初始化时机
在对象构造完毕前即可(非静态常量),被final修饰的变量只能赋值一次。



