Java中一切皆为对象,但此对象非彼对象,彼对象却是此对象的一种具体体现。如何理解这句话呢?Java是面向对象的编程语言,对象是面向对象程序设计的核心。而所谓的对象就是现实世界中的实体,对象与实体是一一对应的。
在实际开发中,很多时候我们都去new一个对象,而这个对象都可以是现实世界中的某个实体的映射。比如你的对象(女朋友),其就可以作为一个对象,她的状态(如姓名、年龄、性别、身高、体重、出生日期等等)与行为(如喜欢跑步、唱歌、旅游等等)来组成这个对象。说了这么多,对象是什么呢?对象是一个自包含的实体,用一组可识别的特性和行为来标识[DH]。在上面的例子中,你女朋友的状态就是实体的属性,行为就是实体的方法,两者构成了这个实体(你女朋友)。
我们也可以简单的理解为对象是现实世界实体的抽象体,将原本实体所具有的状态和行为通过对象的属性和方法来体现。比如哈士奇具有年龄、体重、毛色等状态,跑、跳、吃、睡等行为,我们将其通过对象来表述的话,哈士奇所具有的状态即对象的状态,哈士奇所具有的行为即对象的方法。
/**
* 哈士奇
* @author ohayoi
*/
public class Husky {
/*
* 哈士奇的状态
*/
private String name;//称呼
private int age;//年龄
private double weight;//体重
private String color;//毛色
/*
* 哈士奇的行为
*/
//跑
public void run() {
System.out.println(this.name + "在外面跑了一圈~");
}
//跳
public void jump() {
System.out.println(this.name + "跳了三次~");
}
//拆家
public void demolitionOfHome() {
System.out.println(this.name + "又完成了一次拆家任务~");
}
}
完成哈士奇对象的实现后,我们想在增加一个波斯猫的对象,波斯猫也具有称呼、年龄、体重、毛色等状态,同时也具有跑、跳等行为,但其不具备拆家的行为,具有舔毛的行为。
/**
* 波斯猫
* @author ohayoi
*/
public class Burmese {
/*
* 波斯猫的状态
*/
private String name;//称呼
private int age;//年龄
private double weight;//体重
private String color;//毛色
/*
* 波斯猫的行为
*/
//跑
public void run() {
System.out.println(this.name + "在外面跑了一圈~");
}
//跳
public void jump() {
System.out.println(this.name + "跳了三次~");
}
//舔毛
public void lickingHair() {
System.out.println(this.name + "用舌头舔自己的毛,自我清洁~");
}
}
从我们设计的哈士奇和波斯猫的代码来看,状态以及部分行为是重复的代码,假如我们需要更多的动物对象时,如猴子、熊猫、老虎、老鼠等等,我们是不是都要去设计这些对象呢?我们需要对跑这个行为的内容做修改,是不是每个对象都要去修改呢?显而易见,这样设计虽然是可行的,但不便于后续的维护,极易出现错误。那么我们能不能将这些共有的属性和行为抽离出来单独作为一个对象呢?
当然是可以的,这时就引入了类的概念,什么是类呢?类是具有相同特性(属性)和行为(方法)的对象的抽象,说直白一点类就是一个模板,用于描述具有相同状态和行为的一类事物。比如猫、狗、老虎、狮子等都属于哺乳类动物,它们都具有年龄、体重、毛色等状态和跑、跳、吃、睡等行为,那么我们就可以将它们共有的状态和行为放置在一起作为一个模板,这个模板就是我们所说的类,这个类是它们各自的父类(也称作基类),而我们的猫类,狗类等都是继承与这个公共类的,这些类叫做子类(也称作派生类)。
/**
* 哺乳动物
* @author ohayoi
*/
public class Mammal {
/*
* 哺乳动物具有的公共状态
*/
private String name;//称呼
private int age;//年龄
private double weight;//体重
private String color;//毛色
/*
* 哺乳动物具有的公共行为
*/
//跑
public void run() {
System.out.println(this.name + "在外面跑了一圈~");
}
//跳
public void jump() {
System.out.println(this.name + "跳了三次~");
}
}
/**
* 狗类继承与哺乳动物类
* A @extends B A继承自B,A为子类,B为父类
* @author ohayoi
*/
public class Dog extends Mammal{
//拆家
public void demolitionOfHome() {
System.out.println(getName() + "又完成了一次拆家任务~");
}
}
这里我们已经将对象和类做了简单的说明,下一节我们将聊聊面向对象编程的三大特性——继承、封装、多态。