类(class)是构造对象的模板或者蓝图。我们可以将“类”想象成制作小甜饼的切割机,将“对象”想象为小甜饼。由类构造(construct)对象的过程称为创建类的实例(instance)。
封装 (encapsulation,有时称为数据隐藏) 是与对象有关系的一个重要概念。从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据成为实例域(instance field),操作数据的过程称为方法(method)。对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态(sate)。无论何时,只要向对象发送一个消息,它状态就有可能发生改变。
实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域。乘车仅通过对对象的方法与对象数据进行交互。封装给对象赋予了“黑盒”特征,这是提高重用性和可靠性的关键。这个意味着一个类可以全面地改变存储数据的方式,只要仍就是用同样的方法操作数据,其他对象就不会知道或介意所在发生的变化。
oop:面向对象三个基本特征:封装、继承、多态
OOP的另一个原则会让用户自定义Java类变得轻而易举,这就是:可以通过扩展一个类来建立另外一个新的类。事实上,在Java中,所有的类都源自于一个“神通广大的超类”,它就是Object。
在扩展一个已有的类时,这个扩展后的新类具有所有扩展的类的全部属性和方法。在新类中,只需要提供适用于这个新类的新方法和数据域就可以了。通过扩展一个类来建立另外一个类的过程称为继承(inheritance)。
对象 要想使用oop,一定要清楚对象的三个助于特性:
对象的行为(behavior)--可以对对施加那些操作,或可以对对象加那些方法?
对的状态(state)--当时家那些方法时,对象如何响应?
对象标识(identity)--如何辨别具有相同行为于状态的不同对象?
依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
public class ClassTest {
public static void main(String[] args) {
Car c = new Car();
//依赖与关联
Driver d = new Driver();
d.driver1(c);
d.driver2();
d.driver3();
}
}
class Car{
public static void run() {
System.out.println("汽车在奔跑");
}
}
class Driver{
//使用形参方式发生依赖关系
public void driver1(Car car)
{
car.run();
}
//使用局部变量发生依赖关系
public void driver2()
{
Car car= new Car();
car.run();
}
//使用静态变量发生依赖关系
public void driver3()
{
Car.run();
}
}
关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。
public class ClassTest2 {
public static void main(String[] args) {
// 关联关系
Driver2 d2= new Driver2();
d2.driver();
}
}
class Car2 {
public static void run(){
System.out.println("汽车在奔跑");
}
}
class Driver2{
//使用成员变量形式实现关联
Car2 mycar;
public void driver() {
mycar.run();
}
}
聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
class Driver3{
//使用成员变量形式实现聚合关系
Car mycar;
public void driver() {
mycar.run();
}
}
组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。
继承
面向对象编程(oop)语言的一个主要功能就是“继承”。继承是指这样的一个种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 继承现有类+扩展
通过继承创建的新类称为“子类”或“派生类”
被继承的类的称为:“基类”、"父类"或“超类”
继承的过程,就是从一般到特殊的过程
要实现继承,可以通过“继承”(inheritance)和“组合”(Composition)来实现。
在某些oop语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式有三类:实现继承、接口继承、可视继承。