面向对象的特性:
1、封装
2、继承
3、多态
封装:
概念:
生活:快递需要包装,增加安全性
代码:方法(封装体) 、 类(封装体)
问题: 在对属性进行赋值时,可能赋了不符合生活逻辑的数据
原因:没有对数据的合理性进行判断
解决办法:1、使用private关键字修饰属性
2、对外提供该属性的setter/getter方法
注、 布尔类型的getter/setter方法中,没有getxxx,而是isxxx
private作用:对成员进行私有化,这个成员只有在本类中使用
关键字:this
表示当前的调用者
优点:提高代码的安全性和复用性
*** 标准实体类的定义:
1、属性
2、属性的setter/getter方法
3、空参的构造函数
4、全参的构造函数
构造函数(构造方法、构造器)
概述:
作用:
1、创建对象
2、基于优先执行的特点,可以在构造函数中完成基础配置
3、在创建对象的同时为属性进行初始化
特点:
1、无返回类型,void都不能写
2、方法名与类名一致
3、构造函数优先于类中的方法的执行,且每次创建对象都会执行构造函数
注:
1、每个类都有一个隐式的无参的没有方法体的构造函数
## 构造函数的重载
概念:多个构造函数具有不同的参数列表(构造函数名 与类名相同)
细节:
1、使用this来区分成员和局部
2、无论属性有多少个,一般重载构造函数都会写上全部的属性
3、如果构造函数重载了,那么默认(隐式的无参的)的构造函数就不存在了
4、如果还想要通过无参的默认构造函数来创建对象,必须手动写出
标准的实体类的写法:
1、属性
2、所有属性的setter/getter方法
3、无参构造函数
4、全参构造函数
继承
概念:
子类可以直接访问到父类的非私有成员
继承主要研究的就是子类内容的共性抽取,前提是符合逻辑的向上抽取
注:子类可以具备特性内容
好处:
1、提高了代码的复用性
2、完成了多态的前提
父类: 超类、基类
子类:派生类、衍生类
格式:
使用关键字 extends
public class 类名 extends 父类名{
}
## 继承关系中成员变量的特点
子类优先使用本类中的成员变量,如果没有则向上查找父类中是否有该变量有则使用,没有则报错
若子类和父类中有相同的变量,想要在子类中调用父类变量,需要在子类中用super关键字去调用父类变量
子类访问变量:
1、访问局部变量--->直接访问
2、访问成员变量---->用this关键字调用
3、访问父类的成员变量 ----->用super关键字调用
## 继承关系中成员方法的特点:
子类优先会用本类中的成员方法;如果没有则向上查找父类是否有该方法,有则使用,没有就报错
重写:@override
概念: 子类对父类的功能进行扩展
重写的要求:
1、方法名相同
2、参数列表相同
3、子类重写方法的返回类型必须和父类方法返回类型一致或小于
4、子类重写父类方法的范围修饰符必须大于等于父类,子类是不能重写父类的私有方法的。
范围修饰符(权限修饰符):
作用范围从大到小:
public > protected > 【default】 > private
## 继承关系中的构造函数
1、任何一个类的构造函数的第一行都默认调用了父类的无参构造函数
2、父类中的私有属性,子类可以通过重载构造函数,并在第一行调用父类的重载构造函数来完成创建子类对象并且同时为其赋值
3、子类只能调用父类的一个构造函数,因为父类的构造函数只能出现在子类构造函数的第一行。
4、父类的构造函数和子类的构造函数不能在同一个构造函数中调用
注: 1、子类构造函数种调用本类其他构造函数也要放在第一行
2 、构造函数的调用只能在构造函数中
## super和this的作用
### super
1、调用父类的成员变量
2、调用父类的成员方法
3、调用父类的构造函数
### this
1、调用本类的成员变量
2、调用本类的成员方法
3、调用本类的构造函数
继承体系中的注意事项:
1、Java中类与类之间不能有多继承(接口可以多继承)
2、一个类可以有多个子类
3、类之间可以有多层继承
多态
## 概述:
例如: Student类继承了Person类,那么Student的对象既是一个Student也是一个Person
表示:既可以将子类(实现类)对象赋值给该类的引用变量,也可以将子类(实现类)对象赋值给父类的引用变量
最终体现:父类的引用变量指向子类的对象
代码:
Student s = new Student();
Person p = new Student(); 都是成立的
## 二、多态的情况
### 2.1 类继承普通类
class Fu {
}
class Zi extends Fu{
}
Fu f = new Zi();
### 2.2 类继承抽象类
abstract class Fu{
}
class Zi extends Fu{
}
Fu f = new Zi();
### 2.3 类实现接口
interface Fu{
}
class Zi implements Fu{
}
Fu f = new Zi();
## 三、 多态下的成员特点
### 3.1 成员变量
子父类具有同名变量,使用父类的
父类没有,子类调用编译报错
编译时期:要使用子类的成员变量,必须在父类中也有该成员变量的前提下才能调用,否则编译失败
运行时期:使用的是父类的成员变量
简单记:编译看左边,运行也看左边
### 3.2 成员方法的特点
编译时期:必须在父类也有的成员方法的前提下才能调用,否则编译失败
运行时期:使用的是子类重写后的成员方法
简单记: 编译看左边,运行看右边
## 四、转型
### 4.1 向上转型
子类对象赋值给父类引用变量,多态本身就是向上转型的过程
格式:
父类/接口 f = new 子类/实现类();
Fu f = new Zi();
### 4.2 向下转型:
在向上转型后,可以通过强制类型转换,将父类引用变量转换成子类引用变量
格式:
向上转型后:Fu f = new Zi();
再向下转型: Zi z = (Zi)f;
注:
1、如果没有向上转型,直接对父类对象转换成子类对象,会发生classcastEXxeption(类型转换异常)
2、如果已经向上转型了。但是多态时的子类类型与强转后的类型不一致,也会发生classcastException(类型转换异常)
## 五、instanceof关键字
功能: 判断对象是否属于指定类型
格式:
对象 instanceof 类型
情况:
没有意义的比较:
非多态情况下或者任何一个子类与其父类的比较都是没有意义的
有意义的比较:
1、多态情况下,将父类引用变量与任意一个子类类型作比较。
如果向上转型的过的且是通过该子类创建的,返回true,
反之返回false
## 六、 总结
### 6.1 什么时候转型
向上: 扩展功能时
向下:当要使用子类特有成员时
### 6.2 多态的好处和特点
好处:
将子类对象赋值给父类变量,,使用的是这个多态后的父类变量,所以隐蔽了子类类型,提高了代码的扩展性
缺点:只能使用父类中的成员,不能使用子类的特有成员,如果要使用,必须向下转型才能使用