2021-03-09
Day 3, 面对对象编程,Object-oriented Programming
对象是什么
在现实中,任何一个物体都可以是一个对象Object, 而每一个物体都有两个特征: 状态state 与 行为behavior, 狗有着名字,颜色,种类等状态以及叫,跳,摇尾巴等行为
现实中的对象有的很复杂,有的很简单。台灯可能只有开启和关闭两种状态,打开和关掉两种行为,甚至有一些对象里面会包含其他对象。而这一切也都存在与面对对象编程。
Java内的对象将它的状态存在域 filed(也有些语言称为变量)内,并通过方法 method(也有些语言称为function)来表示出它的行为,
方法对对象的状态进行操作,而将对象的状态藏起来,并使所有交互从对象的方法内完成,叫做封装 data encapsulation
将代码分为单个的对象好处
- 模块化 Modularity: 每一个对象的源码可以单独的维护而不影响其他对象。对象创建后可在系统内传递
- 信息隐藏 information-hiding: 只对对象的方法进行交互,而对象的状态可以被隐藏封装起来
- 重复使用 code re-use:若某个对象已经被创建过了,你可以直接使用该对象(面对GitHub面对StackOverflow面对csdn编程)
- 方便Debug:若某个对象出了问题,可以直接移除并写入新的对象。就像电脑显卡坏了,直接换个显卡就好
类是什么
类的定义其实和字面意思差不多,许多东西都归属于某个类,比如三角形属于图形类,我的山地车属于自行车类
而在Java中,我们称我的自行车车为自行车类class of bicycles的实例instance, 而类class便是每一个对象的来源。
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
以上代码创建了一个自行车类,称为bicycle,而cadence, speed,gear 三个域(或是变量)代表了对象的状态,而changeCadence, changGear,speedUp定义了对外界的交互, 即对象的方法
在以上代码,我们仅创建了一个可能会被程序使用的类所以并非一个完整的程序。在程序的其他类内,我们可能会使用这个类,如下:
class BicycleDemo {
public static void main(String[] args) {
// Create two different Bicycle objects
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// Invoke methods on those objects
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
在以上代码,我们包含了main方法,也就是完整的程序,我们创建了两个自行车bike1和bike2,并在后面通过方法进行了交互interaction
类的继承
不同的对象也许会有不同的特征,但一般也会有相同点。山地车,公路车和速降车都有着自行车的特征(踏频,速度,档位等等),而每种车都有着自己的独特点使他们不同。
在面对对象编程时,类可以从其他的类里继承 inherit共同的状态与行为,在自行车的例子里,自行车便是山地车,公路车和速降车的父类 superclass,山地车,公路车和速降车便是自行车的子类 subclass。 在Java中,每一个类可以有一个直接direct的父类,而每一个父类可以有无限个子类
创造一个子类的方法很简单,在创建类时使用extends
关键词如下即可
class MountainBike extends Bicycle {
// new fields and methods defining
// a mountain bike would go here
}
以上代码将Bicycle设为了MountainBike的父类,MountainBike将继承并拥有Bicycle所有的状态和方法,但依然可以新建其他的特性并不影响其他类与对象。
在编写父类时一定要注意将注释写好,因为父类的源代码不会在子类内出现。
接口是什么
在之前提到了,对象为通过定义方法来对外界进行交互,也就是说对象的接口interface便是方法。在现实中也一样,比如电视机的按钮便是你和和电视之间的接口。
一般来说,Java内的接口为一组有关联的方法,但并没有代码主体。一个自行车的行为,若写成接口,便可能如下:
interface Bicycle {
// wheel revolutions per minute
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
而要将接口实现时,需要使用implements关键词如下,注意接口内的每一个方法都应在类内实现
class ACMEBicycle implements Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
// The compiler will now require that methods
// changeCadence, changeGear, speedUp, and applyBrakes
// all be implemented. Compilation will fail if those
// methods are missing from this class.
public void changeCadence(int newValue) {
cadence = newValue;
}
public void changeGear(int newValue) {
gear = newValue;
}
public void speedUp(int increment) {
speed = speed + increment;
}
public void applyBrakes(int decrement) {
speed = speed - decrement;
}
public void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
为什么要用接口:
接口可以实现多态以及泛用性,而抽象类abstract class也可以做到多态
简单来讲,就是接口(以及抽象类)可以指向实现接口的对象,比如上面自行车的代码,便可以使用 Bicycle bike = new ACMEBicycle()
,于是可实现多态。 若仅为实现简单多态,写一个抽象父类也可以
而当需要实现的方法不是当前类,或者需要为多个不同类实现相同的功能的必须时,抽象父类便不好用了,而接口便可以实现,详见接口的意义
包Package
类似于电脑内的文件夹,package是一个类和接口的集合。Java有一个自带的库称为Application Programming Interface, 即API
API内包含了巨量的包,比如Java.lang,Java.util等等,我使用过的String, Array均为API内的包的对象
Reference
Java Documentation
Java 常用API
Interface 详解