学习完前 3 节后是否感觉似乎学会了一些东西,但是又感觉脑袋里充满了浆糊?

这一节我们来整理一下思路, 算是前一阶段的小结, 为开启新的征程做好准备.

一下吃太多了,消化不良了, 呵呵~

两个办法可以让自己好受点:

(1) 暂时停下脚步,再看一遍前 3 节,自己做一下小结,一个字…… 悟!

(2) 实践,自己做几个小例子,实践一下前面讲过的内容

BUT! 多年的实践证明,说了也等于白说,能停下来悟道的人不多……

所以,作为一个好人,下面我还是带你站高一点,宏观地看看目前学过的这些东西,也许会有帮助。

OK, 走起~

事实上,那些让人晕头转向的语法规定一直致力于通过引入一些机制, 让程序员少干点活, 并引导程序员保持相对清晰的头脑, 干活更有条理.

相对术语化地说, 即是:

  • 尽可能地实现”代码重用“, 而又不失灵活性.

  • 提供一些”开/闭机制“, 让程序员得以在“封闭”与“开放”之间寻找一个最佳的平衡.

  • 更高层次来说, 便于实现更加稳固且便于扩展的程序架构.

我们来回顾一下前两节学过的一些东西……

“类” 和 “对象” 概念的提出实现了数据功能封装,将其聚合为一个相对独立的单元,而**”继承”*机制的引入最直接地实现了代码重用. 并且, 在继承过程中父类为子类指明了发展的方向*.

“重载”实现了一个类内部的”变异”, 而“覆盖” 则体现了继承过程中子类代对父代的”革新”, 这些都为程序员提供了扩展的途径.

虽然, 封闭的”最高境界”是封得密不透风, 但若真如此就没有意义了. 因此, public, protected, private 修饰符在不同的范围内提供了开放的可能性, 并把控制权交给了程序员, 即: 可控的开/闭.

static 修饰符的引入在一个方面实现了对象之间的数据共享. 同时将数据和功能从对象层面提到了类层面, 或者说把数据和功能从相对 “动态” 的对象中提到相对 “静态” 的类中.

final 修饰符又封堵了变化可能性, 给程序员一机会做到适时地封闭.

最后, 为那些之前只接触这 C 语言这类”面向过程”的程序设计语言的同学洗个脑……

在使用C这样面向过程的程序设计语言编程时, 我们的工作大致可以分2步:

(1) 功能封装: 定义实现各种功能的函数(过程);

(2) 通过函数间的相互调用, 让程序运行起来……

而使用 Java 这样的面向对象的程序设计语言编程时, 我们首先站在对象的视角去定义类

然后…… 在运行时, 让类实例化成对象, 然后…… 调用对象的方法 ( 函数 ) 以完成所需的工作, 然后…… 然后就没有然后了……

对照之前的实例, 想想是不是这个过程:

首先把自己当做一头猪 ( 小花 (对象) ), 思考做为一头猪应该有些什么数据和功能, 然后定义猪类, 然后……通过 new Pig() 把猪类变成小花 ( 具体的对象 ), 然后…… 调用小花的 eat() 方法让它吃东西, 然后…… 就没有然后了……

最后的最后做个节目预告, 下一节我们将学习 “接口” 和 “抽象类”, 本节就先到这里, 给一点消化的时间……


后面的教程中我们还要继续延伸这个”猪”的例子, 为了保证你的代码与我的例子没太大出入, 现将到目前为止的代码附上……

文件结构:

Pig.java

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
30
31
32
33
34
35
36
37
package com.bailey.study.animal;

public class Pig {

protected String name;

final public String sex;

public Pig(String name) {
this(name, "未知");
}

public Pig(String name, String sex) {
this.name = name;
this.sex = sex;
}

public void eat(String food) {
System.out.println(name + "吃了" + food);
}

public void eat(String food, boolean isHot) {
if (isHot) {
System.out.println("等呀等... 终于凉了...");
}
eat(food);
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

SmallPig.java

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
package com.bailey.study.animal;

public class SmallPig extends Pig {

public SmallPig(String name) {
this(name, "未知");
}

public SmallPig(String name, String sex) {
super(name, sex);
}

@Override
public void eat(String food) {
if (!"奶".equals(food)) {
throw new RuntimeException("小猪只能吃奶!"); // 不是"奶", 抛出异常
}
super.eat(food); // 调用父类eat方法
}

public void play(String toy) {
System.out.println(name + "玩了会" + toy);
}
}

HelloJava.java

1
2
3
4
5
6
7
8
package com.bailey.study.test;

public class HelloJava {
public static void main(String[] args) {

}
}