Java三大特性
- 封装
- 继承
- 多态
封装
什么是封装
将类内部的实现隐藏起来,只暴露对外的接口。防止该类的代码和数据被外部类定义的代码随机访问。
封装的作用
- 降低代码的耦合性
- 隐藏信息、具体的实现细节
- 可以对成员进行更精确的控制
- 内部结构可以自由修改
继承
继承的作用
子类从父类继承方法,使其具有和父类相同的行为。
继承的特性
- 提高了类之间耦合性
- 子类可以访问父类非private的属性与方法
- 子类可以重写父类的方法
- 子类可以拥有自己的属性和方法,对功能进行扩展
- Java中只支持单继承,但是可以多重继承
super与this关键字
super用来访问父类成员或当前父类,
this指向当前类的引用
final关键字
用final关键字声明的类是最终类,无法被继承
用final关键字声明的方法无法被重写
用final关键字声明的变量无法被修改
构造器
子类不会继承父类的构造器,只是显示或隐式地调用。如果父类构造器需要参数,则在子类构造器中使用super();传入匹配的参数。
多态
什么是多态
一个 父类类型 的变量,指向其子类创建的对象,这个父类的变量能够调用子类中重写的方法,使得父类变量拥有了不同的行为特征。
在编译时 方法的行为 表现的是父类方法的行为特征,而运行时表现的是子类重写方法的行为特征。
(简单说就是向上转型:父类引用指向子类对象)
为什么使用多态,多态的特点
-
代码复用,减少代码冗余
-
减小代码耦合性
使用了某个子类重写的方法,当业务需求变动时仅需修改该子类的方法,而不需要牵连到其他代码。
-
便于拓展功能
通过重写子类的方法,可以使对象实现不同的功能
实现多态的方式,以及他们的区别
方式:2种(继承,实现接口)
继承方式
使同一类别或拥有一定规律的类作为父类,具体的行为方式依靠子类实现
//父类
public class Car {
public void show(){
System.out.println("汽车");
}
}
//子类
public class BMW extends Car {
@Override
public void show(){
System.out.println("我是宝马,土豪专用。");
}
public void duXiang(){
System.out.println("这是我独享的moment。");
}
}
//多态使用
Car car = new BMW(); //向上转型
car.show(); //输出:我是宝马,土豪专用。
//怎么使用子类独有的方法:向下转型(强转)
BMW baoma = (BMW)car;
baoma.duXiang();
实现接口方式
//接口
public interface XuanYaoI {
public void show();
}
//实现类
public class Car implements XuanYaoI {
@Override
public void show() {
System.out.println("这车一般般,也就100万,发条朋友圈。");
}
}
//使用
XuanYaoI xuanyaoI = new Car();
xuanyaoI.show(); //输出:这车一般般,也就100万,发条朋友圈。
(额外)继承和接口的区别
不同点 | 抽象类 | 接口 |
---|---|---|
修饰符 | extends | implements |
是否支持多继承 | Java只支持单继承 | Java类支持实现多个接口 |
变量定义 | 变量,常量 | 只能定义全局常量 |
方法定义 | 可以有抽象和非抽象的方法,可不定义抽象方法 | 只能定义抽象方法 |
子类方法重写 | 只需要重写需要的方法 | 必须实现接口的所有方法 |
抽象层次 | 对整个类进行抽象,包括属性、行为 | 对局部行为进行抽象 |
设计层次 | 自底向上抽象泛化 | 自顶向下设计 |
跨域 | 抽象针对一系列具有相同特征的的类 | 可以跨域不同的类 |
实现多态的必要条件
- 继承
- 重写
- 父类引用指向子类对象
多态的要求
- 子类的 变量/方法 的作用域必须大于父类
- 子类无法访问父类的private变量
- 不能用子类的静态方法隐藏父类的实例方法
- 不能用子类的实例方法隐藏父类的静态方法