面向对象的特征:封装、继承、多态、(抽象)
一、封装
体现形式:
函数 --- 提高代码的复用性。
属性的私有化 --- 将属性设为私有,通过提供对外的访问方法来间接操作对象属性,可以再方法内对属性做一系列的限制使其符合要求 ---- 提高代码的安全性。
扩充: 权限修饰符
public :本类、子类、同包类、其他类。
protected : 本类、子类、同包类。
default : 本类、同包类、同包子类
private : 本类
二、继承
对一些类的属性和方法进行提取,提取出来一个新的类。通过extends关键字使新的类 与旧类产生继承关系。新类称之为父类、超类、基类,而旧的类称之为子类、派生类
注意:
java中只支持单继承 --- 一个子类只能有一个父类 ,而一个父类可以有多个子类。
优点:
1. 提高代码安全性。
2. 提高代码复用性。
3. 统一代码结构。
super关键字:
在创建子类对象时,会先创建一个父类对象,而这个父类对象在子类中以super关键字的形式存在。
super是父类对象的引用,可以认为是父类产生的一个虚拟对象。
如果一个构造函数中已经存在了this关键字,那么此时不能再写super语句。
super()语句必须放在首行。
调用super()语句时会自动匹配父类中对应形式的构造函数。
问:
1. 子类的每个构造函数都间接或直接的有一个super语句?
解: 正确。
子类继承父类后,子类的构造函数再编译时JVM会默认添加(隐式定义)一个无参的super()语句。 --- 直接
在子类的某个构造函数中用this语句调用另一个构造函数,此时不能直接再写super语句。但是this()语句调用的构造函数中会有默认的(隐式定义的)super()语句或显示定义的super(args[])语句 --- 间接
2. 如果父类中只提供了含参构造,子类的构造函数还能使用默认的super语句么?
解 : 不能。
每一个类都有构造函数。当用户没有定义构造函数时,JVM会自动添加一个无参构造,当用户定义了有参构造后,JVM将不在提供无参构造。
在创建子类对象时会先 创建父类对象,super关键字是对父类对象的引用,而默认的super()语句实际是调用父类的无参构造,所以当父类定义有参构造后,子类将不能继续使用默认的super()语句,而是由用户调用super(args[])
3. 可以通过this来调用父类中的属性或方法么?
解: 可以
子类使用this关键字调用属性或方法的时候,会先检查当前类中是否有对应的属性,如果没有则在检查父类。
重写:
在父子类 中,如果存在类方法签名一致的方法,则成为函数的重写|覆盖 (方法签名 : 方法名+参数列表)
注意:
重写必须遵守五个原则:两等两小一大
1. 方法签名一致
2. 当父类中的方法返回值类型是基本数据类型、void、最终类,子类重写方法的返回值类型必须一致。
3. 当父类中方法返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类一致,要么子类方法返回值类型是父类方法返回值类型的子类。
4. 当父类中抛出异常声明时,子类抛出的异常声明必须是父类抛出异常声明的子类。
5. 子类方法的权限修饰符应该 大于 或等于父类方法的权限修饰符。
三、多态
- 多态是java面向对象的三大特征之一 , 也是最重要的特征 。
- 多态: 同一事务的多种形态 或状态 。
- java程序执行可以分为编译期和运行期 , 根据多态出现的不同时期可分为:
- 编译时多态(编译时期发生) --- 重载
- 运行时多态 (运行时期才动态绑定具体执行的代码)--- 向上造型、重写 ---- 继承时运行时多态的前提。 (向上造型 : 父类 对象名 = new 子类();)
- 重载 : 重载特点-- 在同一类中,函数名相同 , 参数列表不同 。 根据重载的特点 , 我们可以通过调用同一函数名 ,执行不同的逻辑 ---- 编译是多态
- 向上造型 : 父类声明 , 子类创建实例 。 在编译时 , JVM只检查声明类和具体实现类是否有继承关系 , 而不去关心具体是那个子类 , 在编译期也不会具体绑定实现类, 而是直到运行时才确定具体执行哪个子类中的方法 , 这种多态称为运行时多态 。
- 重写:重写时体现的运行时多态是在向上造型的基础上的 ,向上造型时 , 通过父类声明的对象调用方法 , 调用时只关心父类有没有这个方法 ,而不关心执行时执行父类还是子类的方法 。 在执行时才会检查子类 , 如果子类重写了这个方法 , 则执行子类的方法 , 如果没有,则执行父类中的方法 --- 运行时多态 。
注意:
使用向上造型创建对象的时候,用父类声明,用子类创建;父类再声明时就相当于k==geile这个对象一份提纲;子类创建对象时是告诉这个对象该怎么干 ---- 能不能用看父类,具体实现看子类。
重写的理解:
1. 方法签名一致
解释: 重写的概念。
2. 当父类中的方法返回值类型是基本数据类型、void、最终类,子类重写方法的返回值类型必须一致。
解释: 向上造型 时,需要使用父类对象的方法接受子类重写后方法的返回值,如果是引用数据类型,则可以使用父类接受子类,此时要求父类中方法的返回值类型等于或者是子类方法返回值类型的父类;如果是基本数据类型,由于八种基本数据类型是相互平等的,不存在继承关系,所以返回值类型要求一致。
3. 当父类中方法返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类一致,要么子类方法返回值类型是父类方法返回值类型的子类。
解释: 向上造型 时,需要使用父类对象的方法接受子类重写后方法的返回值,如果是引用数据类型,则可以使用父类接受子类,此时要求父类中方法的返回值类型等于或者是子类方法返回值类型的父类;如果是基本数据类型,由于八种基本数据类型是相互平等的,不存在继承关系,所以返回值类型要求一致。
4. 当父类中抛出异常声明时,子类抛出的异常声明必须是父类抛出异常声明的子类。
解释:向上造型时,父类中抛出的异常声明必须要能接住子类抛出的异常声明,所以要求父类中抛出的异常声明是子类中抛出的异常声明的父类。
5. 子类方法的权限修饰符应该 大于 或等于父类方法的权限修饰符。
解释: 向上造型时,调用方法看父类,具体执行看子类,所以要求父类中方法能执行的地方子类中方法也要能执行,所以子类中权限修饰符的范围必须大于或等于父类中方法的权限修饰符。
多态的产生就是为了解耦.