面向对象三大特性指的是:封装、继承、多态。
这三大特性支撑了整个面向对象的理论体系,是面向对象的核心
封装
1)概念
尽可能的隐藏对象的内部实现细节,控制用户对类的修改和访问的程度及权限,保障数据安全(数据隐藏)
对象的边界对对象内部的属性和方法起到保护的作用。
public 公开 不受边界约束
private 私有 只能在本类内部访问 无法突破边界
2)实现方式
私有属性:private 修饰属性,其他类无法访问
编译出错:
提供公开的get/set方法
语法:
获取属性:public 类型 get属性名( ){
return 属性;
}设置属性:
public void set属性名(类型 名称){
this.属性名 = 名称;
}例:
访问形式:
封装前:
获取属性: stu.age
设置属性: stu.age = 100;封装后:
获取属性: stu.getAge();
设置属性: stu.setAge(100);
继承
概念:类与类 is a 关系的体现,可以提高代码重用性。
1) is a 关系
类与类的一种关系,即子类(派生类) 是一种 父类(超类,基类)
前者一定拥有后者的特征与行为
子类一定拥有父类的属性与方法
2) 继承语法
class 子类 extends 父类
Dog继承了Animal类,则Dog类会获得Animal类中所定义的属性和方法
例:创建Dog对象访问eat方法
执行结果:
创建子类对象时,父类对象会作为子类对象的一部分体现在内存中。
※注意:
- Java中的继承关系为单继承关系,一个类只能有一个直接父类,但是可以多级继承。
- private成员(属性、方法) 无法继承(无法访问)
3)访问权限修饰符
本类 | 同包 | 子类 | 其他包 | |
---|---|---|---|---|
private | √ | |||
(default) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
4) 方法覆盖(OverRide)
当父类所定义方法无法满足子类需要时,可以在子类中声明与父类相同的方法进行覆盖
语法要求:
访问权限修饰符相同或更宽,返回值类型、方法名、参数表相同
※注意:
参数表不同不构成覆盖,是重载。
5)super关键字
1、 super.
在子类中可以通过 super. 访问父类中的属性和方法**2、super()、super(参数)
显示调用父类的构造方法,必须放在构造方法的第一行**3、如子类构造方法第一行没有super(),则编译器自动添加(保证父类能够优先被创建)。
6)创建对象的过程
1、分配空间(子类+父类)
2、初始化父类属性 创建父类对象
3、调用父类构造方法
4、初始化子类属性 创建子类对象
5、调用子类构造方法※注意:当继承关系为多级,2~3步循环执行。
多态(Ploymorphism)
1)概念:
父类引用可以指向不同的子类对象,可以产生多种形态。
2)语法:
父类类名 引用名 = new 子类类名;
父类类型 = 子类对象
主观类型 = 客观类型
3)特点:
- 子类对象始终不变
- 编译时,只能调用引用类型中声明的方法
- 运行时,如果子类覆盖了父类的方法,则执行覆盖后的方法
4)对象类型转换
子类对象 赋值给 父类引用
Animal a = new Dog( );
多态父类引用 转换为 子类引用
Animal a = new Dog( );
Dog d =( Dog ) a; //如果想调用Dog中独有的方法时// 父类引用赋值给子类引用时,必须进行强制类型转换(保证编译通过),运行时,如果父类引用中所存储对象类型不符时,则会出现运行时异常。
Animal a = new Cat();
Dog d = (Dog) a ; //编译通过运行时出现:java.lang.ClassCastException类型转换异常
※注意:
如果两个引用不存在继承关系,则不允许强制类型转换(编译错误)
5)作用
屏蔽子类之间差异
利于拓展,降低程序间耦合
6)instance of 关键字
判断:引用类型中 所存储的对象 是否与 某一类型 兼容、
语法:
引用名 instanceof 类型(类名) //该表达式的结果为 boolean
true - - - 代表引用中所存储的对象 与该类型兼容
false- - - 代表引用中所存储的对象 与该类型不兼容(不是该类型或 该类型的父类)
作用:判断父类引用中所存储的对象类型后再进行强转,避免类型转换异常