OOP
OOP全称Object Oriented Programming,是指面向对象程序设计,是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
Java是一个面向对象程序设计(Object Oriented Programming,OOP)的语言。
类和对象
对象(Object)是任何看得见、摸得着、感觉得到,可以获得的东西,有自己的标识的任何东西。对象是某一类的事物的具体个例。比如这辆汽车、这个人、这间房子、这张桌子、这株植物、这张支票、这件雨衣,概括来说就是:万物皆对象。
类(Class),是一个模板,它描述一类对象的行为和状态。
听完类和对象,懵懵懂懂,举个栗子:类(车的模子),对象(宝马车、奔驰车......)。
封装
解决了数据的安全性问题。
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
所以,封装有2个原则:
- 将不需要对外提供的内容都隐藏起来;
- 提供一些接口将内部与外部连接起来;
下面给出一个示例:
package com.example;
public class Student {
/**
* 属性私有化,避免属性被直接使用和修改
*/
private Integer age;
/**
* 对外提供公有的方法用来获取对象的属性值
* @return Integer
*/
public Integer getAge() { return age; }
/**
* 对外提供公有的方法,可以对对象的属性进行控制,避免不合法的操作
* @param age 年龄
*/
public void setAge(int age) {
if (age > 0 && age < 100) {
this.age = age;
} else {
System.out.println("输入的年龄不合法!");
}
}
public static void main(String[] args) {
// 创建对象
Student stu = new Student();
// 调用对象提供对外的接口进行设置对象的属性
stu.setAge(10);
// 调用对象提供对外的接口获取属性值后进行打印
System.out.println(stu.getAge());
}
}
使用封装的好处:
- 减少耦合: 可以独立地开发、测试、优化、使用、理解和修改
- 减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
- 有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能
- 提高软件的可重用性
- 降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的
继承
解决了代码的重用问题。
继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
继承的特点:
- 子类拥有父类非private的属性和方法
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
- 子类可以用自己的方式实现父类的方法(方法重写)
- 构造函数不能被继承
- 继承使用extends关键字实现
public class Cat extends Animal{
// ...
}
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型。
public class Cat extends Animal{
// ...
public static void main(String[] args) {
Animal animal = new Cat();
}
}
多态
解决了程序的扩展问题。
多态分为 编译时多态 和 运行时多态。
编译时多态:编译时多态主要指方法的重载。
运行时多态:运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
示例:
class Animal {
private void eat();
}
class Dog extends Animal {
public void eat() {
System.out.println("dog eating...");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("cat eating...");
}
}
public class MainClass {
public static void main(String[] args) {
List<Animal> animalList = new ArrayList<>();
animalList.add(new Dog());
animalList.add(new Cat());
for (Animal animal : animalList) {
animal.eat();
}
}
}
参考资料
- Java编程思想
- 面向对象设计的SOLID原则
- Java实现OOP(面向对象编程)
更多系统学习,请前往:
https://www.yuque.com/javahome