1. 基本概念
面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构,基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
2. 面向对象核心思想
核心思想 | 描述 |
抽象 | 从具体事物中抽取、概括出它们共同的属性和行为的过程。 |
封装 | 把抽象出来的属性和行为结合为一个独立的整体,并尽可能隐藏内部细节的过程。 |
继承 | 从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力的过程。 |
多态 | 同一个行为具有多个不同表现形式或形态的能力。 |
3. 继承
只要两个类满足 is-a 的关系,就可以使用继承关系实现,继承的特点:
项目 | 描述 |
子类 | 子类拥有父类所有在子类中可以访问到的成员属性和成员方法。 |
扩展 | 子类可以重写父类中的方法,也可以定义独有的方法。 |
限制 | 类只能单继承,只允许有一个父类。 |
需要区分两个概念:
项目 | 描述 |
方法重载(Overload) | 发生在同一个类中,只要求方法名相同、参数列表不同,与访问权限修饰符和方法返回值类型无关。 |
方法重写(Override) | 发生在继承关系的子类中,要求返回值类型、方法名、参数列表都相同,且访问权限不低于父类中的方法。 |
4. 抽象类
抽象类用 public abstract class 类名
定义,抽象类的特点:
项目 | 描述 |
成员属性 | 可以拥有成员变量和成员常量 |
成员方法 | 相比于普通类,多了抽象方法 |
实例化 | 不能实例化对象,只能创建普通子类对象 |
继承 | 抽象类只能被单继承 子类是抽象类,可以不实现父类中的抽象方法 子类是普通类,必须实现所有的抽象方法 |
其他 | 由于必须被普通类继承才能使用,所以不能有 final 关键字修饰类 |
注意一个逻辑关系:抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类或接口。
5. 接口
接口用 public interface 接口名
定义,是 Java 中的一个抽象类型,是抽象方法的集合,特点:
项目 | 描述 |
成员属性 | 只能定义静态常量(public static final 修饰) |
成员方法 | 没有构造方法 JDK8以前只有抽象方法 JDK8新增默认实现和静态方法 JDK9新增普通私有方法 |
实例化 | 不能实例化对象,只能创建接口实现类对象 |
继承/实现 | 接口只能使用 extends 继承接口 抽象类和普通类只能用 implements 实现接口 抽象类实现接口,可以不实现抽象方法 普通类实现接口,必须实现抽象方法 接口支持多继承和多实现 |
其他 | 接口只能被普通类实现后才能使用,所以不能用 final 修饰 |
6. 多态
多态指同一行为有不同的表现形式,多态又分为编译时多态和运行时多态。
表现形式 | 描述 |
编译时多态 | 指方法重载,在编译期,根据调用方法时传递的参数列表,确定调用哪一个重载方法 |
运行时多态 | 指方法重写,在运行期间确定调用父类方法还是子类方法 |
平时说的多态指的是运行时多态,它有三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象:
Parent p = new Child();
编译时多态实例:
public class A {
public int sum(int a, int b) {
return a + b;
}
public double sum(double a, double b) {
return a + b;
}
}
class Demo {
public static void main(String[] args) {
A a = new A();
int s1 = a.sum(1, 2); // 传递整数,调用第一个 sum 函数
double s2 = a.sum(1.0, 2.0); // 传递小数,调用第二个 sum 函数
System.out.println(s1); // 3
System.out.println(s2); // 3.0
}
}
运行时多态实例:
public class A {
public int sum(int a, int b) {
return a + b;
}
}
class B extends A {
@Override
public int sum(int a, int b) { // 重写
a *= 10;
b *= 10;
return a + b;
}
}
class Demo {
public static void main(String[] args) {
A a = new B(); // 父类引用指向子类对象
int sum = a.sum(1, 2); // 运行时才确定调用,调用的是子类中重新的放啊
System.out.println(sum); // 30
}
}
7. 本篇涉及的关键字
- 访问权限修饰符,可以修饰类、成员变量、成员方法。
关键字 | 描述 |
public | 任何地方都能访问 |
protected | 当前类、当前包中的类、子类能访问 |
不声明(default) | 当前类、当前包中的类能访问,其他包中的子类也不能访问 |
private | 只能在当前类中访问 |
- 类相关
关键字 | 描述 |
this | 指代调用方法的对象,谁调用,指向谁 |
super | 指代父类对象,可以调用父类中非私有的属性和方法 |
final | 表示最终 修饰的成员变量不能修改 修饰的类不能被继承 修饰的方法不能被重写但可以重载 |
extends | 用于实现继承关系,类继承类只能单继承,接口继承接口可以多继承 |
implements | 用于类实现接口,类可以实现多个接口 |