Java面向对象
面向对象的三大特性:
- 继承
- 封装
- 多态
继承
目的:实现代码的复用
具体介绍:
- 若两个子类具有相同的属性和方法时,可以将相同的一部分抽取出来放置公共的父类
- 子类可以继承父类,继承后的子类将拥有父类的属性和方法(除了私有方法和构造方法)
- 重写:子类可以复写父类的方法,命名与父亲类名相同的成员变量
- 仅子类和本身访问的属性和方法可用(
protect
)修饰
类成员访问修饰符的功能范围
类型 | private | 无修饰(包限制) | protect(包和子类限制) | public |
---|---|---|---|---|
同一类 | ✅ | ✅ | ✅ | ✅ |
同一包中的子类 | ❎ | ✅ | ✅ | ✅ |
同一包中非子类 | ❎ | ✅ | ✅ | ✅ |
不同包中子类 | ❎ | ❎ | ✅ | ✅ |
不同包中的非子类 | ❎ | ❎ | ❎ | ✅ |
封装
定义:隐藏对象属性和实现细节,仅对外公开接口,控制读和修改的访问级别
目的:增强安全性,简化编程
基本实现:属性私有化,添加get,set方法,控制接口访问业务
多态
同一个行为具有多种不同表现形式或形态的能力
同一接口,使用不同的实例,执行不同的操作
多态的实现方式
- 重写
- 接口
- 抽象类和抽象方法
Java的常见问题
重写与重载
重写Override
- 子类对父类允许访问的方法重新编写,返回值和形参都不改变(外壳不变,核心重写)
- 重写不能抛出新的异常,或者更加宽泛的异常(儿子还是儿子,不能比老子强)
- final、static不能重写,构造方法不能被重写
重载Overload
- 一个类里,方法名称相同,参数不同,返回类型可以相同也可以不同
- 构造器的重载
重写与重载的区别
接口与抽象类的比较
语法层面的区别
接口 | 抽象类 |
---|---|
只能存在抽象方法 | 提供成员方法的实现细节 |
只能存在抽象的成员变量 | 成员变量可存在多种类型 |
不能含静态代码块和静态方法 | 可以有静态代码块和静态方法 |
一个类可以实现多个接口 | 一个类只能继承一个抽象类 |
设计层面的区别
接口 | 抽象类 |
---|---|
行为抽象 | 事物抽象 |
针对事物的局部行为抽象 | 针对整体事物:属性,方法抽象 |
接口是一种行为规范,辐射式设计 | 抽象来可做很多子类的父类,模版式设计 |
一旦进行变更,实现类必须变更 | 一旦进行变更,实现类可不进行变更 |