如何实现小球的移动
还是先走一个小球吧,已经做了很多次了,我们开始思考,如果用户按了键盘上的一个键,那么子啊整个计算机系统中,谁最先知道这件事情呢?这个大家都可以猜出来没错就是键盘,不过后面的事情,键盘到底是通知给谁了?我们干脆跳过中间环节吧,一定会到操作系统对吧?如果你的程序要能够响应用户的输入,是不是操作系统要将这件事情通知给你的程序?系统怎么能够把一件事情通知到你的程序呢?其实之前我们遇到过类似和系统打交道的事情无论是开始的main,还是重画的paint,抑或是线程的run都是和系统打交道的,系统和程序交流的唯一办法就是你准备一个方法,它会在合适的时候来调用。难道我们要一个个地记住方法吗?Java的设计者提供了一个很好的解决方案——接口
我们现在来认识接口,其实在前面的线程里我们已经使用了接口Runnable,但是那个时候我们没有仔细讲接口是什么,为什么一定要使用接口。
我是个对象,我是个男人类的对象,可以这么说,男人是从一大堆相似的对象中抽象出来的一个概念,男人是人类的一种,应该是人类的子类,也就是说,人类是从男人和女人中抽象出来的,人类是动物类的子类,那么动物类就是人类的抽象。我们现在要写出一个类——动物类,你想想动物类该怎么写,我想至少得有吃,喝,拉,撒,睡这些方法,那么我们就定义这些方法,具体到”吃”这个方法,你觉得有办法描述清楚动物的”吃”吗?是不是没法描述,因为不同的动物的吃有很大差别。
class Animal{
public void eat(){
//描述如何吃
}
}
注释的位置是不是很难办,我确切地知道作为一个动物一定要有吃的方法,但是我现在没有办法描述,既然这个样子就干脆不描述了。
class Animal{
public void eat();
}
如果你是在eclipse上这么写,你会发现编辑器马上就会报错,因为没有方法的主体,可是不知道怎么写主体呀,那你可以在这个方法前说明这个方法是”抽象”的。
class Animal{
public abstract void eat();
}
Animal类的这个地方也立刻报错了,它提示如果类里面有抽象方法,那么这个类也需要说明成抽象的。其实到现在都很好理解,我们抽象,抽象抽象到一定程度,得到了一个叫做动物的类,可是这个类太抽象了,很多东西我没法描述,那么我就告诉Java编辑器,这是抽象的,我不具体写内容了。
abstract class Animal{
public abstract void eat();
}
又有一个问题,抽象类能产生对象吗?如果你是Java编辑器,别人给了你一个代码,代码里将抽象的类变成对象,你有办法吗?所以抽象类没法生成对象。
我们再想想动物类里面的其他办法,你会发现所有的方法都没法描述,不但方法没法描述,而且根本找不到声明变量的需要,我们管这样的类叫做纯抽象类,在Java里纯抽象类会被替换成另一个名字叫做接口。
interface Animal{
public void eat();
}
class Person implements Animal{
}
我们用一个人的类来实现动物的接口,代码写到这儿,你就会发现Person下面有红色波浪线,这个类就出错了,把鼠标放在Person上面,提示告诉你,必须实现接口Animal里面抽象的方法eat。这有什么用?
举个例子,还是我老师和我说的,假设我现在是一个班的老师,班里有20个学生,我觉得天天上课太辛苦了,而且钱还赚的少,我现在想出了一个好办法,我出去接一个软件开发的活,报价10万,根据之前的标准,大约有10万行的代码量,我的课改成了实训项目,也都不用上课了,每个学生平均5000行代码,各自回家去完成,一个学期结束,完成的学生这门课就通过了,而且不但赚了讲课的钱,还把外包的软件的钱给赚了,这个计划看上去很好,但是有一个问题,就是到最后,我需要将20个人写的10万行代码给合并起来才能拿去售卖,这样我难道要看懂10万行代码吗?不,这样看上去太累了,于是我规定,学生们要给自己写的5000行代码写上注释,每个人最多有200行标注上是给我看的,其他的我不用看就能合并,这个规定在Java里不需要,所有要给我看的代码前要写上public,不需要我