您的位置:首页 > 编程语言 > Java开发

Java, just a language (二)

2015-06-21 21:02 302 查看
Java, just a language (二)
by 梦中浮云

!声明:如果您有意愿转载本文,请在文章醒目位置注明原文链接。

        在准备写第二篇之前,我花了一段时间去思考一个问题。该不该把Java的基础知识全部过一遍?无奈作者是个懒得不行不行的人,所以本系列只会围绕类来阐述,其他的还是交给专业写教材的人去完成。

        从本篇开始,我们就要介绍代码了。如果你觉得看起来很吃力,相信我,你需要去学习Java的基础知识。下面给出类的基本格式:

        [public]
class ClassName{

            实例变量;

            public ClassName(parameter list){

            }

            [public] methodName(parameter list){

            }

        }

        1. 类的关键字:class

           关键字为何物,自行学习。

        2. 类的名称:ClassName

           Java程序员有个约定俗成的做法,Java程序中的名称统一使用驼峰表示法。即单词之间没有其他符号,每个单词的首字母大写。类名的首字母必须大写!其实,就算你用小写也会通过编译,只不过多数人都在标成大写。

        3. 访问修饰符:public

           正如它的意思那般,public表示公有的。与其相对的是private,即私有的。公有类可以被其它类访问,私有类不能被访问。

        4. 类的内部:实例变量+方法

           实例变量和普通变量的定义方法一样。

           方法和C语言中的函数是类似的,不同的是,它也需要访问修饰符。

        5. 构造函数:以类名为名字的特殊方法

          构造函数的作用就是完成类的实例化。

        类是对对象的抽象,那么我们可以将类看成是一个空洞的对象。我们怎么去描述一个对象?通过特征。特征分为静态特征和动态特征,比如:人的眼睛鼻子属于静态特征,而吃喝拉撒属于动态特征。静态特性又可以叫做属性,对应于class中的实例变量。动态特征又叫做行为,对应于class中的方法。这样一来,就不难理解为什么class的组成会这样了。

        普通方法内部做些什么我就不说了,因为我没法说。我们来看看构造函数里面到底做了些什么神秘的事情。构造函数是用来实现实例化过程的,那么实例化一个对象需要做什么呢?其实,它只做了一件事情,初始化实例变量。比如:一个人出生的时候,他的静态特征都是已经确定的。

        到了这里你应当对类的结构有了一定的理解了,不过还欠缺一点,一点变化。

        当你学习了一种规则的时候,一定要尝试着去变通。虽然构造函数的作用是那样,但里面什么都不写是可以的,调用一个方法也是可以的。比如:一个婴儿还在胎中的时候,我们确定了有这个人,但长什么样实在是不知道。所以你最多先给他(她)取个名字,等到出生的时候一看,哇!长得忒俊俏了!这便是空构造函数的例子。至于调用方法就更简单了,我们把赋值过程写在一个方法里,再在构造函数中调用,多了一个中介而已。

 

        继承的表达形式如下:

       
***** class ClassName extends
FatherClassName{}

        是不是很简单?就这么简单。但是其背后的概念却又不那么简单了。我不是在故意说绕口令,接下来我们就来看看extends的难点。

        假如我们已经定义了灵长类,当我们定义人类的时候,四肢、眼睛、鼻子这些实例变量已经在灵长类中存在了,那么我们就可以有充分的理由去省去这些变量的再定义。可是,人类也需要用这些变量,这时候用extends就可以了。继承的目的就是,共有的放在父类中,独有的放在子类里。

        第一篇中吐槽过,Java的所有动作都要从类开始。在这一篇里,我要扩充一下吐槽内容,Java的实例化都要从基类开始。怎么理解这句话,还是生物的例子。如果你要实例化一个人,你要走这么一个流程。造一个动物,造一个哺乳动物,造一个灵长动物,造一个人。很麻烦,但这是必要的。就像盖楼房一样,你要盖第3层,就必须先把地基、第1层、第2层盖好。幸好,我们在写类的继承时只需要考虑父类的实现,建第3层的人没必要去关注地基怎么建。

        如果一个类继承自其他类,那么在这个类的构造函数中,必须先调用父类的构造函数。一般我们用super关键字来代替父类,用super(parameter list)来代替父类的构造函数。注意,我要强调一下“先”字,父类构造函数的调用必须放在第一句。

 

        多态

        多态不像继承那样有一个extends关键字,它是一些组合行为的结果。三个条件:继承,重写,父类指向子类。

        继承在上一部分已经讲过了,不再解释。之前提到子类继承了父类的实例变量,现在要加一句,子类也继承了父类的方法。人类继承了灵长目动物杂食的方法,但是人类的吃很讲究。在可消化的前提下,我们多了色香味的要求。此时,就出现了重写的概念。

        子类可以定义与父类同名的方法,并用不同内容实现,这就是重写。

        下面为了讲清楚父类指向子类这个条件,我们假设出如下情境:

        某一天,动物界发生内乱。哺乳纲、两栖纲、鸟纲三足鼎立。哺乳纲下设三大军团:食肉目、灵长目、啮齿目。哺乳纲伙食部统一为三军做饭,可是自己的菜谱是空的,于是需要调用各军团内部菜谱。很明显,哺乳纲伙食部有足够的权限去调用下属军团的菜谱。菜谱到了之后,伙食部就要依照菜谱做出三类饭来,以供三军食用。食肉目的是鱼肉,灵长目的是满汉全席,啮齿目的是小食品。

        父类的变量去指向子类对象,然后依据子类的不同采用不同的内容实现同名方法。这就是多态了。

        与重写名字相似的是重载,这里不对重载进行解释,读者可自行查阅学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 技术 多态 继承