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

上一篇文章从计算机原理角度初探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为了实现多态的机制也是蛮拼的。

运行结果:
这里写图片描述
少了了很多代码省时省力,同时也定义了行为规范,大家都必需遵守了。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值