面向对象的特征
封装、继承、多态(、抽象)
封装
将某些逻辑或者是代码提取成某种对应的形式,这个提取的过程就是封装
封装包括:方法的封装、类的封装以及访问权限的封装。
访问权限设置主要体现为---将属性设置为私有的,然后通过提供对外的方法来获取或者设置这个属性值,在方法中可以限制属性值使之更符合场景要求。
封装的优点:提高代码的复用性,提高代码的安全性【因为属性私有化、方法公开化】
权限修饰符
| 本类中 | 子类中 | 同包类中 | 其他类中 |
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
默认 | 可以 | 同包子类可以 | 可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 |
继承
发现一些类中有部分共有的属性和方法,将这些共有的属性和方法提取到了一个新的类中,让这个新的类和原来的类产生联系(关系),这种关系就称之为继承。
利用extends关键字产生继承关系。新的类称之为父类或超类,原来的类就称之为子类或派生类。子类可以通过继承使用父类中的一部分属性和方法。
【注意:这里继承的不能是超出访问权限的方法或属性,如父类中的private方法等,但是父类中的私有属性可以通过get和set进行调用】
java中支持的是单继承---一个子类只能有一个父类,但是一个父类可以有多个子类,但是java的JVM是支持多层继承的。
单继承和多继承的比较:
多继承在代码的复用性上做的比单继承好,但是单继承代码安全性更高。
super关键字
指在子类中表示父类对象的引用,用于调用父类中的方法和属性
子类构造函数中通过super语句来调用父类对应形式的构造方法来创建一个父类对象。如果子类没有手动添加super语句,那么jvm在编译的时候会自动添加一个无参的super语句。如果父类只提供了含参构造,那么子类的构造函数中都必须手动提供含参的super语句。
同时注意:调用父类的构造方法必须放在子类构造函数的首行,表示在创建子类对象的时候必然要先创建一个父类对象。[同时因为this和super都必须放在第一行,所以有this没super,有super没this,但是构造函数可以this调用的构造里面的第一句写super]
方法的重写
在父子类中存在方法签名完全相同的方法。称之为方法的重写(覆盖),英文名为Override。
【注意:除了private修饰的方法子类不可见,所以不是重写,并且static修饰的方法也不是重写---后续介绍】
重写方法一定是要发生在父子类中,同时遵循两等两小一大的规则
1. 方法签名一致
2. 如果父类中的方法的返回值类型是基本类型/void,那么子类在重写这个方法的时候返回值类型也必须一致。
3. 在重写的时候,子类重写的方法的权限修饰符的范围要大于等于父类中方法的权限修饰符的范围
4. 如果父类方法的返回值类型是引用类型,那么子类在重写方法的时候,重写的方法的返回值类型小于父类的返回值类型【这里认为父类大于子类】
多态
编译时多态:方法的重载
运行时多态:方法的重写 和向上造型
向上造型指的是父类引用指向派生类对象,如 Animal ani = new Dog(); 我们称Animal为声明类,Dog为实现类,能够调用那些方法需要看父类对象,当方法为重写方法时,调用的是 子类中重写的方法。
需要注意的是,方法的重写和向上造型都是基于继承的,继承是运行时多态的前提。
//注意:向上造型不能调用子类中独有的方法
注意:当用向上造型来创建对象的时候,能干什么看父类;怎么干看子类。---父类规定了有哪些东西可以使用,子类来具体执行
注意: 所有的基本类型之间没有继承关系!基本类型之间之所以能够相互转化,是因为基本类型所占的空间的大小不一致而且都是表示的数字。