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

深入java (类)深入理解类的继承和初始化顺序

2017-05-12 11:24 411 查看
上一篇文章从计算机原理角度初探java类对象使用堆和栈,也总结了构造函数的使用要点,这一篇文章我们继续深入,总结类的继承及意义,类的初始化顺序,从jvm的角度以及java语言设计的角度分析:构造类对象的时候构造函数的调用顺序。下一篇咱们从设计的角度出发,探讨继承(父类),抽象类和接口,不用死记硬背,就可以理解为什么用这几种不同的设计。原创不易,转载请注明出处:http://blog.csdn.net/yabay2208

一:类的继承及意义

当我们在写程序的时候,我们很关心的是代码的复用问题,java对此解决的方案有继承和组合两种,当然,这就会跟多态扯上关系,不过我们以后再深入分析多态,这里先了解类的继承。不仅如此,继承中的类都被规范相同或者相识的特性的行为(方法),起到规范化的作用。

其实继承就是将某一类的事物,将他们共有的特性(实例变量/静态变量)和行为(方法,用到局部变量)抽象出来,作为一个普通类(这样说其实不完全正确,下一篇文章就会告诉你为什么。)

我们的同一类事物中的具体不同的类用extends关键字,“继承”这些共有的特性和行为,然后从中添加自己特有的属性和方法,“子类”中就有了共有的方法和属性,这样就实现了代码的重用,当然我们也可以对方法进行覆盖(重写),实现有一点不一样的某一个共有行为。

到这里您就会好奇,刚刚不是说将共有的抽象出来吗?为什么这里相同的我们都已经抽象出来了,实现了代码的重用,你又要说重写方法实现不同的行为呢?

其实这里涉及到一个抽象粒度的问题,从哲学的层面看:

我们举一个例子:

我们有15个人(其中有一个是哑巴,说话的行为用手语),他们有

1.说话行为{say()方法}

2.坐行为{sit()}

3.跑行为{run()}

这3个共有的行为:如果我们为了照顾所有人:只抽象两种行为,那么意味着:这15个人都要写一遍说话行为{say()方法},其中有14个人是一样的,只有一个人的不一样;(我们就要写14次相同的代码,你愿意吗?);但是如果我们也将说话行为{say()方法}抽象出来,那么14个人的代码不用写,我们只需要将哑巴的说话行为{say()方法}重写覆盖抽象中的方法就可以了,很高效吧?

举一个很简单例子说明问题:

我们的父类:



我们把相同的属性抽象出来:分别是身高年龄和名字;

我们把相同的行为抽象出来:分别是自我介绍行为和性取向行为;

接着我们实现具体的子类:



其中可以看见因为Gay的性取向不太一样,所以我们重新定义他的行为(重写方法:whatSexLike()):他就可以有自己的权利实现一点点的与众不同了。

我们在重写方法的时候,有几点需要特别注意一下:

1.因为复写的行为是父类的规,所以我们必须要遵守这个行为的大致准则,其中有一点是特别重要的:返回值和参数类型、参数个数和参数顺序必须一样。否者就变成了重载。

2.访问的权限一定要越来越大或者相等。为什么:因为如果你的父类是public,而子类的行为是private,会让程序在编译器可以通过,在执行期间突然变得不可读写和存取(多态),这显然是不合理的,同时编译器也不会允许你这样做。这是java的多态机制导致的,看来java为了实现多态的机制也是蛮拼的。

运行结果:



少了了很多代码省时省力,同时也定义了行为规范,大家都必需遵守了。

限于篇幅原因,为了更好的查看,我们下一篇再写类的加载和初始化顺序

二:类的加载和初始化顺序(下一篇)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 函数 jvm 继承