面向对象三大特性:封装、继承、多态
1.封装
封装的好处:
- 封装可以隐藏实现的细节,封装内部可以很复杂,对外提供简单的操作入口,使得使用者可以不关心内部实现原理,可以实现简单运用
- 封装之后才会形成真正的独立体
- 封装之后,以后的程序可以重复使用,可在许多场合下使用。
- 封装之后,字段和实现细节被隐藏,不允许外部直接访问,事物的安全性得到提高。
属性私有化(private),通过get和set方法(非静态方法)得到和修改属性。
2.继承
class A {}
class B extends A{}
B类继承A类
A类称为超类(superclass)、父类,基类。
B类称为子类(subclass)、派生类、扩展类
作用:
- 基本作用:子类继承父类,代码可以复用。
- 主要作用:有了继承关系,才有方法的覆盖和多态机制
要点:
- Java只允许单继承,不允许多继承,但是可以出现间接继承的效果。
- 子类在继承的时候,除了构造方法无法继承外,其余都可以继承,但是私有属性无法在子类中直接访问。
- 当类没有显示的继承某个类时,默认继承object类。
- 在实际开发过程中,能用“is a”来描述的都是可以继承的。
- 继承的缺点:继承让代码的耦合度变高,父类在修改的时候,子类也会受到牵连。
方法重载(Overload):
一个类当中,功能相同,建议名字也相同,这样代码美观且易编程
- 在同一个类当中
- 方法名相同
- 参数列表不同
方法重写(Override、Overwrite):
又叫方法的覆盖
- 子类从父类中继承过来的方法,这个方法无法满足子类的需求时,需要重写方法。
- 当子类对象对继承过来的方法进行方法覆盖之后,子类对象在调用该方法的时候,一定会执行覆盖之后的方法。
重写的条件:
- 两个类必须有继承关系。
- 重写之后的方法必须和原来方法具有相同的返回值类型,相同的方法名,相同的参数列表。
- 访问权限不能更低,可以更高。
- 重写之后的方法不能比原先的方法抛出更多的异常。可以更少
注:
- 方法覆盖只是针对方法,和属性无关
- 构造方法不能被继承和覆盖。
- 方法覆盖只是针对实例方法,和静态方法无关。
- 私有方法无法重写覆盖
多态
举例:
class Animal{
public void move(){
System.out.println("动物移动")
}
}
class Cat extends Animal{
public void move(){
System.out.println("猫在移动")
}
}
public static void main(String[] args){
Animal c1 = new Cat();
c1.move;
}
输出结果为“猫在移动”
分析:
Java程序分为编译阶段和运行阶段
1.编译阶段:
- 对编译器来说,编译器只知道c1的类型是Animal,所以编译器在检查语法的时候,会去Animal.class字节码文件中找到move()方法,找到了就绑定上move()方法,编译通过,静态绑定成功(编译阶段属于静态绑定)。
2.运行阶段:
- 运行阶段的时候,实际上在堆内存中创建的java对象是Cat对象,所以调用move方法的时候,运行阶段会动态执行Cat的move方法,这个过程属于运行阶段绑定(运行阶段绑定属于动态绑定)
注意:
编译阶段是一种形态
运行阶段是一种形态
多态指的是父类型引用指向子类型对象。
包括编译阶段和运行阶段
编译阶段:绑定父类的方法
运行阶段:动态绑定子类对象的方法