系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、封装
- 二、继承
- 三、多态
- 总结
前言
面向对象编程有三大特征: 封装、 继承和多态。
一、封装
封装(encapsulation)就是把抽象出的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作。
| 封装的好处 |
|---|
| 隐藏实现细节:方法(链接数据库)<–调用(传入参数) |
| 可以对数据进行验证,保证安全合理 |
| 实现封装的三个步骤 |
|---|
| 属性私有化private |
| 提供一个公共的(public)set方法,用于对属性判断并赋值 |
| 提供一个公共的(public)get方法,用于获取属性的值 |
二、继承
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法, 所有的子类不需要重新定义这些属性和方法, 只需要通过 extends 来声明继承父类即可。

class 子类 extends 父类
{}
| 继承的好处 |
|---|
| 代码的复用性提高了 |
| 代码的扩展性和维护性提高了 |
| 继承的使用细则 |
|---|
| 子类会自动拥有父类定义的属性和方法 |
| 子类又叫派生类,父类又叫超类、基类 |
| 子类必须调用父类的构造器, 完成父类的初始化 |
| 不能滥用继承, 子类和父类之间必须满足 is-a 的逻辑关系 |
| java 所有类都是 Object 类的子类, Object 是所有类的基类 |
| 父类构造器的调用不限于直接父类! 将一直往上追溯直到 Object 类(顶级父类) |
| 子类最多只能继承一个父类(指直接继承), 即 java 中是单继承机制 |
| super 在使用时, 必须放在构造器第一行(super 只能在构造器中使用) |
| super() 和 this() 都只能放在构造器第一行, 因此这两个方法不能共存在一个构造器 |
| 如果希望指定去调用父类的某个构造器, 则显式的调用一下 : super(参数列表) |
| 子类继承了所有的属性和方法, 非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访问, 要通过父类提供公共的方法去访问 |
| 当创建子类对象时, 不管使用子类的哪个构造器, 默认情况下总会去调用父类的无参构造器, 如果父类没有提供无参构造器, 则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作, 否则, 编译不会通过 |
| 继承的本质 |
|---|
| 先加载父类信息和父类属性 |
| 首先看本类是否有该属性或方法,如果本类没有就看父类有没有,直到Object |
| 找到了但不能访问或找不到就报错,如此反复循环寻找 |
package com.hspedu.extend_;
/**
* 讲解继承的本质
*/
public class ExtendsTheory {
public static void main(String[] args) {
Son son = new Son();//内存的布局
//?-> 这时请大家注意, 要按照查找关系来返回信息
//(1) 首先看子类是否有该属性
//(2) 如果子类有这个属性, 并且可以访问, 则返回信息
//(3) 如果子类没有这个属性, 就看父类有没有这个属性(如果父类有该属性, 并且可以访问, 就返回信息..)
//(4) 如果父类没有就按照(3)的规则, 继续找上级父类, 直到 Object...
System.out.println(son.name);//返回就是大头儿子
//System.out.println(son.age);//返回的就是 39
//System.out.println(son.getAge());//返回的就是 39
System.out.println(son.hobby);//返回的就是旅游
}
}
class GrandPa { //爷类
String name = "大头爷爷";
String hobby = "旅游";
}
class Father extends GrandPa {//父类
String name = "大头爸爸";
private int age = 39;
public int getAge() {
return age;
}
}
class Son extends Father { //子类
String name = "大头儿子";
}

三、多态
总结
封装、 继承和多态每一个特征都很重要。


















