封装、继承、多态
一.封装
1. 封装的介绍
封装即使把抽象出的数据[属性],和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行访问
2.封装实现的步骤
1)将属性进行私有化private
private 修饰符的优点:
private是四种权限修饰符中的一种 并且是权限最小的一种
private 可以修饰成员变量 和成员方法
private 修饰属性和方法,就只在当前类中才能访问,在当前类以外的其他地方都不能直接访问
private 修饰的属性,称为类中的私有属性,private修饰的方法,称为类中的私有方法
2)提供一个公共的(public)set方法 ,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx表示某个属性
属性=参数名字;
}
3)提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx(){
return xxx;
}
3.封装的优点
1)提高代码的安全性,重要的信息可以私有化,不对外暴露
2)提高代码的复用性,常用的代码或者功能封装到方法中,可以在其它地方反复调用
3)封装代码的实现细节,便于修改内部代码,提高可维护性
4)简化外部的调用,便于调用者使用
5)可以对数据进行验证,保证安全合理
二.继承
1.继承的基本介绍
继承可以解决代码的复用,让我们的编程更加靠近人类的思维,当多个类中存在相同的属性 (变量)和方法时,可以从这些类中抽出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,值需要通过extends来声明继承父类即可 。
2.继承的好处
1)提高代码的复用性,代码的扩展性和维护性提高了
2)类与类之间产生关系,这是使用多态特性的前提
3.继承的基本语法
class 子类 extends 父类{
}
1)子类就会自动拥有父类定义的属性和方法
2)父类又叫超类、基类
3)子类又叫派生类
4.继承细节
1)子类继承了所有的属性和方法,非私用的属性和方法可以在子类中直接访问,但是私有属性 和私有方法不能在子类中直接访问,要通过父类提供的公共方法去访问(比如 : get 、 set方法
)
2)子类必须调用父类的构造器,完成父类的初始化
3)当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super
去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
4)如果希望指定去调用父类的某个构造器,则显式调用一下:super(参数列表)
5)super
在使用时,必须放在构造器的第一行(super
只能在构造器中使用)//如果this
和super
不是都要调用构造器的话,那么同时出现就没有问题
6)super()
和this()
都只能放在构造器的第一行,所以这两个方法不能共存在一个构造器
7)java所有类都是Object
类的子类,Object
是所有类的基类。
8)父类构造器的调用不限于直接父类!将一直往上追溯直到Object类
9)子类最多只能继承一个父类(指直接继承 ),即java中是单继承机制。
10)不能滥用继承,子类和父类之间必须满足is-a的逻辑关系
super
的优点
1.调用父类构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
2.当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super
。如果没有重名,使用super
、this
、直接访问是一样的效果!
No | 区别点 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继承查找 | 从父类开始查找属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没有此方法则从父类继续查找。 | 从父类开始查找方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
4 | 特殊 | 表示当前对象 | 子类中访问父类对象 |
三.方法的重写与重载
1.基本介绍
- 方法重写:就是子类又一个方法,和父类的某个方法名称、返回类型、参数一样,那么我们就说子类的这个方法重写了父类的方法
- 方法的重载:类中有多个方法,具有相同的方法名,但是方法的参数各不相同,这种情况就称为方法的重载
名称 | 发生范围 | 方法名 | 形参列表 | 返回类型 | 修饰符 | 抛出异常 |
---|---|---|---|---|---|---|
方法的重载 | 本类中 | 必须一样 | 类型,个数或者顺序至少有一个不同 | 无要求 | 无要求 | 无要求 |
方法的重写 | 父子类 | 必须一样 | 相同 | 子类重写的方法,返回类型和父类返回的类型一致或者是其子类型 | 子类方法不能缩小父类方法的访问范围(public-protected-default-private ) | 方法抛出异常类型的范围可以被缩小,但是不能被扩大 |
四.多态
1.多态的基本介绍和前提
- 多态的基本介绍
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。 - 多态的前提
- 子类继承父类
- 子类重写父类中的方法
- 父类的引用指向子类对象
2.对象的多态
- 例:
Amimal animal = new Dog(); //animal 编译类型是Animal 运行类型是Dog
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以变化的
- 编译类型看定义时=号左边,运行类型看=号 的右边
3.多态的向上向下转型
- 向上转型
- 本质:父类的引用指向了子类的对象
- 语法:父类类型 引用名 = new 子类类型();
- 特点:编译类型看左边 运行类型看右边。
可以调用父类中的所有成员(需遵守访问权限)
不能调用子类中特有的成员
最终运行效果看子类的具体实现
- 向下转型
- 语法:子类类型 引用名 = (子类类型)父类引用;
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的引用必须指向的是当前目标类型的对象
- 当向下转型后,可以调用子类类型中的所有的成员
4.instanceof
- instanceof 可以告诉我们当前父类的引用,到底是执行的哪一个子类对象