Skip to content

Latest commit

 

History

History
77 lines (46 loc) · 4.46 KB

Lesson10.md

File metadata and controls

77 lines (46 loc) · 4.46 KB

Lesson 10 - 类和对象初印象

在学过这一节后,大家就都可以创建很多很多对象了,就都可以做一个不受道德谴责的“海王”了。不说什么了,先放张我每年复习课都会用到的表情包镇个楼:

gf

咳咳,就不开玩笑了。这节课以及以后的几节课,我都会用设计一个简陋的精灵宝可梦对战游戏👾作为例子来对类与对象的概念进行具体的说明和诠释。希望它能让大家更生动形象地体会到这种面向对象的编程思想,而不是纯讲概念,那样会太过抽象。说是对战游戏,其实也没有那么高端,只是借用两只精灵对战的模式。玩家可以操控一只自己的宝可梦,在野外探险,遇到精灵可以与之对战。在回合制的对战过程中,每个回合我们可以指定我们的宝可梦要使用的技能,最后当有一方血量降为零时对战结束。

想要以概念去将一个游戏最终以代码的形式实现出来,对于初学者必然是很有挑战性的。其实我在大一下学期第一次备这节课(实现这个对战游戏)的时候,也是第一次去尝试理解类和对象。所以现在看来,刚开始在写这个东西的时候我还是处于懵懵懂懂的阶段,后来是慢慢写着写着就有了更加贴身的体会,最终变为知识体系给大家讲出来。纸上得来终觉浅,绝知此事要躬行。再改动一下孔老夫子的话,想学好Java是学而不试则罔,试而不学则殆。只是学习却不尝试就会迷惑而无所得,只是尝试却不学习就会精神疲倦而无所得。有的同学上课很认真,做起作业来就无比吃力,想必是尝试的太少;有的同学说自己做作业debug尝试到凌晨两三点,却依然无能为力,想必是需要学习如何有效去进行debug。

1 什么是对象?什么又是类?

我:“为了搞出来一个像样的精灵对战游戏,首先我们可得有精灵才行。为了能让一个精灵“出现”在我们的程序里,我们得存储这个精灵的一些状态数据,比如:名字、属性、生命值、攻击力、防御力、速度等等。我们怎么存储好呢?”

聪明的你:“那还不简单,有几个属性就开几个变量不就好了。”

String name;
int HP;
int attack;
int defense;
int speed;
...

我:“还没完呢!咱们可不能只有一个精灵啊,精灵对战,我在游戏的过程中还会不断地遇到新精灵的哦?每次你都声明这么多变量的吗?”

你:“在理诶,那该怎么办呢?”

那就交给**对象(object)**来做这件事吧!

对象 Object

为了聚合一系列的基本数据,将他们聚合成为一个有意义的实体,最后使得每次我们都可以通过这个实体去访问到它的属性,因而才有了对象。在这个例子中,我们希望将nameHPattack等等属性聚合到一个名叫pikachu的对象中,每次我们要获取它的属性,就可以使用pikachu.namepikachu.HPpikachu.attack等去获取就好了。也就是使用对象名.属性名去获取,把中间的点号看成中文中表示归属的助词“的”,就像在访问对象的属性一样,非常直观。

但是并不是所有实体都由相同的基本数据构成,比如对于一个学生这样的实体,我们就不能再使用上面的游戏中描述宝可梦的属性去描述它们,而应当用studentIDname等等属性去描述它们。

而为了规定某一种特定类型的对象应当拥有哪些属性,我们就需要设计类(class),用类去规定相应类型的对象的属性行为

类 Class

类是对象的模板,是创建对象所依据的蓝图,它描述了相应类型的对象的属性和行为。如我们为了可以定义皮卡丘对象,需要定义一个类Pikachu,并为其加上其应该拥有的一系列属性:

public class Pikachu {
    String name;
    int HP;
    int attack;
    int defense;
    int speed;
    
    ...
}

在有了这个类之后,我们就可以像这样创建这个类的对象p并操作它的属性啦:

// Create an pikachu
Pikachu p = new Pikachu();

// Initialize the field of the object
p.name = "Java";
p.HP = 1000;
p.attack = 99999;
p.defense = 99999;
p.speed = 2333333;