什么是类,什么是对象,什么是面向对象编程,什么是面向接口编程。学习面向对象思想的语言,比如java,第一关可能就是要理解这些概念。下面就来好好琢磨一下。

类和对象的概念

首先总结一下:类是一个模板,对象就是用这个模板创造出来的东西

比如,男孩,他就是一个模板,男的就行,那么对象是什么呢?就是具体某个男孩,比如男孩BOB,男孩fourColor.

请看下面一张图:

image

男孩女孩是比较抽象的概念,是模板,左边一排就是其具体的一些对象。你看长的都不一样,有的黑,有的白,有的高,有的矮,国家地区也不一样。但是他们都属于男孩或者女孩。

那么同理,人就是一个类,男孩女孩就是人的子类,因为人可能不仅包括男孩女孩,还包括第三性别这个类。

这里还引出了JAVA特性中的继承。继承简单理解就是父类有的东西(访问级别不能是private)的,那都是你的。比如你老爸的房子,就是属于你的,你出入自由。

人还可以分为胖人和瘦人这个子类。所以只要是抽象的模板,就是一个类。

  • 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
  • 类:类是一个模板,它描述一类对象的行为和状态。

下面就拿狗这个类来说事。狗是动物这个类的子类。

Java中创建类

构造器方法说明

需要创造一个类对象出来的时候,要用到这个类的构造器方法,那么啥是构造器方法呢?构造器方法就是创造类时的初始化方法,和类同名的方法,你可以在里面写自己的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//模版
class 类名称 {
访问权限 构造方法名称(){
}
}


//例子
public class Dog{
//构造方法一
public Dog(){
System.out.println("nothing to do...");
}

//构造方法二
public Dog(String name){
//这里就可以给每条new出来的对象(狗)初始化一个名字
System.out.println("hi,my name is "+name);
}
}
一个相对比较完整的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//模版
class 类名称 {
//构造器方法
//声明成员变量---这个变量属于这个类
//声明成员方法
//在方法里面定义的变量是局部变量,区别于成员变量
}

//例子
public class Dog {
//构造方法一
public Dog(){
System.out.println("nothing to do...");
}
//构造方法二
public Dog(String name){
//这里就可以给每条new出来的对象(狗)初始化一个名字
System.out.println("hi,my name is "+name);
}

//狗的颜色--成员属性
public String color;//一般是private,赋值用set方法,取值用get方法,这里只是演示

//狗的行为,它会叫---成员方法
private void say(){
int i = 0;//局部变量
System.out.println("我会叫:汪汪汪~");
}
}

创建对象

语法:

类名 对象名 = new 类名() ;

举例:

1
2
Dog fourcolor ;    // 先声明一个 Dog 类的对象 fourcolor
fourcolor = new Dog("fourcolor") ; // 用 new 关键字实例化 Dog 的对象 fourcolor,此时调用构造方法二

通过Dog这个类可以创造出fourcolor对象.下面我才能操作这个对象:

1
2
3
4
//让它的颜色为黑色
fourcolor.color = "black";
//让它叫
fourcolor.say();

面向对象

在理解了什么是类,什么是对象,就可以来说说面向对象到底是什么了。

先来说说面向过程,大家都学习过C语言。C语言就是典型的面向过程的语言。

举个例子:要把大象装进冰箱里,这件事,面向过程的程序员是这样思考的:

  • 把冰箱门儿打开。
  • 把大象装进去。
  • 把冰箱门儿关上。

上面的每一件事都用一个函数来实现。抽象为下面三个函数:

  • openTheDoor();
  • pushElephant();
  • closeTheDoor();

这样不挺好的吗?为什么不用面向过程的这种思维来编程呢,还要搞出什么面向对象来。

需求又来啦:

  • 「我要把大象装微波炉里」
  • 「我要把狮子也装冰箱里」
  • 「我要把大象装冰箱,但是门别关,敞着就行」

这个时候,面向过程的程序员就悲剧了,来一个需求我就写一个函数,我还能下班吗?

面向对象从另一个角度来解决这个问题。它抛弃了函数,把「对象」作为程序的基本单元。

面向对象的世界里,到处都是对象。即:万物皆对象。

比如人这个类,每个具体的人(对象)都要有这样的属性:身高、体重、年龄。每个人都有这样的行为:吃饭、睡觉、上厕所。

那么,这些通用的属性+方法可以构建一个模板:人这个类。因为每个具体的人(对象)都需要这些基本的东西。当然了,每个人具体什么身高、什么体重、吃什么都是不一样的,所以每个对象一般都是不一样的。但是模板是一样的。

那么,回到刚才的需求,面向对象是如何思考这件事的呢?

  • 向冰箱下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。
  • 向冰箱下达「关门」的命令。

就是说,我不用亲自管开门的细节,我只要叫他开门即可。

我们创建的对象,应该是刚刚好能做完它能做的事情,不多做,不少做。多做了容易耦合,各种功能杂糅在一个对象里。比如我有一个对象叫「汽车」,可以「行驶」,可以「载人」,现在的需求是要实现「载人飞行」,就不能重用这个对象,必须新定义一个对象「飞机」来做。如果你给「汽车」插上了翅膀,赋予了它「飞行」的能力,那么新来的同学面对你的代码就会莫名其妙,无从下手。

但是不禁要问:怎么实现这种下达命令就可以自动去执行的效果呢?或者说,我怎么知道它有这个功能啊!

面向接口编程

现在我们把「数据」和「行为」都封装到了对象里,相当于对象成了一个黑匣子,那我们怎么知道对象具有什么样的能力呢?这个问题的关键就是接口。

因为无论是把大象装进洗衣机还是冰箱,都要求洗衣机或者冰箱有开门和关门的功能。这个时候,我们就可以抽象出来一个接口:【自动门】。这个接口里面定义两个能力:【开门】和【关门】。

让洗衣机、冰箱、微波炉这些带门的东西全部实现【自动门】接口。

这个时候,每个具体的实现可能略有不同,比如冰箱开门是往外拽,但是洗衣机开门可能是往上翻盖子。

此时,我有一个需求,把大象放进冰箱。我一看,冰箱实现了【自动门】这个接口,里面有【开门】和【关门】两个方法,ok,我知道冰箱是可以开门和关门了,那就好办了。我直接下达命令即可。还是跟上面一样的步骤.

  • 向冰箱下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。
  • 向冰箱下达「关门」的命令。

此时,需要将狮子也装冰箱里。那还是一样:

  • 向冰箱下达「开门」的命令。
  • 向狮子下达「进冰箱」的命令。
  • 向冰箱下达「关门」的命令。

此时,我要把大象装冰箱,但是门别关,敞着就行,那就:

  • 向冰箱下达「开门」的命令。
  • 向大象下达「进冰箱」的命令。

是不是很方便?冰箱也可以换,我可以换成任何东西,只要实现了这个接口,这些东西就都有这些能力,那我才不管里面到底怎么实现的呢,直接下达【开门】【关门】命令即可。

这也引入了JAVA特性中另一个特性:封装。外界不知道里面实现细节,只需要知道它的功能和入参即可。

这就是面向过程和面向对象编程的区别,也顺带地理解了什么是面向接口编程。这是学习JAVA最基础也是最核心的点。

整理自: