一、面相对象的三大特征
- 封装,继承,多态, 抽象(有版本把抽象作为第四大特征)
二、封装
- 封装是面相对象的重要原则,就是把对象的属性和方法结合为一个独立的整体,并 尽可能的隐藏对象内部的实现细节。封装是一种信息隐藏技术
- 封装的形式
- 方法:方法其实就是封装的一种常见的形式,通过将某段常用的逻辑进行提取从而形成一种新的形式
- 类的封装:在类中定义了属性之后,如果允许在类外直接操作属性会导致用户直接给属性赋予一些不合常理的数据,所以我们将属性私有化,将属性用private修饰,然后提供对外访问的访问getXXX和设置方法setXXX,在方法中对数据进行限定,更加符合场景的要求
- 内部类:内部类也是封装的一种形式,是为了让代码结构更加的紧凑(后面学)
- 作用
- 提高代码的内聚,降低代码的耦合 度
- 提高代码的复用,降低代码的冗余度,
- 提高代码的安全性
- 通俗的说,封装就是把该隐藏的隐藏起来,把该暴露的暴露出来。
- JavaBean
- JavaBean是 Java语言编写类的一种标准规范
- 规范
- 类必须是公共的
- 有一个无参的公共的构造方法
- 有属性,是私有的,且有对应的get,set方法,是公共的
三、继承
- 如果在一些类中的属性和方法是相同的,那么可以把这些类中相同的属性和方法提出到一个新的类中,然后利用extends关键字让原来的类和新的类产生联系,这种联系就叫做继承,而这个时候原来的类称之为子类,也叫派生类,新的类称之为父类,也叫基类,或者超类
- 注意事项
- 继承是可以传递的
- Java中支持的类之间的继承是单继承,即一个子类只能有一个直接父类,但是一个父类可以有多个子类
- 通过继承,子类可以继承父类全部的数据域(属性和方法),但是只有一部分数据域是对子类可见的,所以子类也只能使用这一部分可见的数据域
- 我们说子类可以继承父类的所有属性和方法,但是不能直接访问父类私有的属性和方法
- 继承的作用
- 提高代码复用,减少冗余
- 统一代码结构
- 方法的重写
- 原因:子类可以继承父类中的方法,而不需要重写编写相同的方法,但是有时子类不想原封不动的继承父类的方法,而是向做出一定的修改,这就需要对父类的方法进行重写,方法重写也称之为方法覆盖
- 概念:在父子类中存在方法签名(方法名+参数列表)相同,方法体不同的方法,就叫做方法的重载
- 遵循的原则:“两等两小一大”
- 方法签名完全一致 (完全相等)
- 如果父类中的返回值类型是基本数据类型/void/最终类 , 那么子类重写的返回值类型必须和父类一致,(如果父类的方法是private修饰的,子类是无法调用的,子类是重新定义了这样一个方法,这不是重写)
- 如果父类方法的返回值类型是一个引用数据类型,子类方法的返回值类型是父类方法的返回值类型的子类
- 子类方法抛出异常的范围不能超过父类(后面学)
- 子类方法的权限修饰符的范围要大于等于父类方法权限修饰符的范围,需要注意的是,八种基本数据类型之间是没有继承关系的,他们是统计的关系。
- 总结
- 两同:方法签名同,返回值类型(基本数据类型和void)
- 两小:子类返回类型范围(引用数据类型)和抛出异常范围小于父类
- 一大,子类访问权限大于父类
- supper关键字
- super表示在子类中对父类对象的引用
- 在子类中可以通过super调用父类中的方法或者属性
- 在子类的构造方法中,通过super关键字调用父类中对应形式的构造方法,如果不指定,默认调用父类的无参构造
- 如果父类中只提供了含参的构造方法,难么子类的构造方法中必须手动定义一个super语句来调用父类中的含参构造
- super语句块必须放在构造方法的第一样,所以super语句不能和this语句同时出现
四、多态
- 什么是多态: 多种形态,比如一个Student继承了一个Person类, 那么一个Student对象,既可以表现Student的状态,也可以表现Person的状态,
- 具体来说:多态是指不同类的对象对同一消息做出的响应,即同一消息可以根据发送对象的不同而采取多种不同的行为方式,多态主要针对对象的方法,而不是对象的属性
- 体现形式
- 编译时多态:在编译时就进行动态绑定的行为,主要体现在方法的重载
- 运行时多态
- 在运行时期才能确定绑定的运行方法,主要体现在向上造型,方法重写上
- 需要注意的是在运行时多态的前提是产生了继承关系或者实现关系
- 向上造型:
- 概念:父类型的引用指向子类型的应用,
- 方法调用与执行:调用方法看等号左边(声明的变量),执行方法看等号右边(具体new的那个对象)
- 向下转型
- 概念:一个已经向上造型的子类对象可以通过强制类型转换,将父类型的引用转换为子类型的引用
- 满足条件(必须满足以下两个条件)
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或者继承了该类
- instanceof 关键字: 我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型
Person p = new Studnet(); boolean flag = p instanceof Student; |
- 向下转型时如果类型不匹配,会抛出 ClassCastException 异常
- 总结
- 什么时候用向上造型
当不确定将要面对的是什么子类类型时,为了提高扩展性,或者使用父类的方法就能满足相应的操作的时候,使用向上造型
- 什么时候用向下转型
当需要使用子类特有的功能的时候,使用向下转型