类与继承

1.什么是继承

从作者本人来讲继承这个概念吧,作者是湖南大学在读学生,这么说来其实作者也是一个大学生,没错吧!现实生活中,学生和大学生是某种包含关系,而学生这个名词范围更加广,大学生这个名词更加的窄。在java语言中,我们知道,在写一个java工程时,肯定要定义很多类,假设我们现在定义了一个student学生类,并且写好了学生类的属性和方法,现在问题来了:我是一个大学生,我有个弟弟,而我弟弟是一个高中生,那么这个学生类能适用我们两个人吗?显然不能吧,准确来说是不完全适用吧!并且,当我们定义高中生与大学生类的时候,都会写到一些关于学生的共同属性比如姓名、性别,和学生的共同方法比如学习等等。因此,为了体现现实生活中真实存在类与类之间的联系,并且减少代码的冗余,我们需要用到继承,此时让大学生类,高中生类去继承学生类。

2.如何继承

java中继承的关键字是extends。  大学生类继承学生类的代码如下图所示

 java8.png

 当Unstudent大学生类通过extends关键字继承了student学生类后,在大学生类中就自动具有了student类中的属性和方法,假设我们已经在student类中完成了学习的方法。那么在创建了大学生类的对象后,也可以调用在学生类中已经实现的该方法了。

 

3.继承之后

 (1)

通过以上我们知道了,在创建了大学生的对象后,可以调用父类即学生类的学习方法。

其实在子类中,我们还可以写该类特有的方法,并且需要注意的是:对于子类特有的方法,一定是要子类类型的对象才能调用,比如我们在定义Unstudent类时写了一个大学生考英语四六级的方法,那么只有是Unstudent类创建的对象才能调用这个方法。

 

还需要注意的是,如果子类中重新定义了构造方法,那么必须手动调用父类的构造方法

java1.png 

 

并且子类在重写父类方法时,不可缩小方法的可访问范围,如果父类中的是public,子类重写方法时也必须是public

 

2)自动转型与强制转型

    在生活中,我们可以这样说:一个大学生是学生,没错吧?在java语言中,其实也有类似的体现,如下图

java9.png

 

这种将子类对象的类型在初始定义为父类类型的写法叫做自动转型,也就是说就是子类对象的类型可以自动转成父类类型。

    现在我们再看看这句话:一个学生一定是大学生,这句话就不对了吧!可是假如通过调查我们发现这个学生确实是一个大学生,但这时候这个这个学生已经被我们定义成学生类的时候,我们应该怎么办呢?这个时候我们就可以用到强制转型了。

 

强制转型的方法如下:

 qq10.png

 

强制转型后,stu1就又成了大学生类型的对象!可以调用大学生类的特有的方法了。

 

不知读者注意到这个又字没?为什么要说“又”呢?因为如果一个对象可以被强制转型,那么在此之前它肯定被自动转型。就是说这个stu1本来应该是大学生类型的对象,我们在初始定义的时候将它自动转换成了父类类型。

 

(3)方法的重写

 刚才我们说到,子类继承到父类后,可以调用父类原有的方法,现在就比如说父类里有一个study学习方法,想一想,这个study方法未免太过笼统了不够具体不是吗?对于不同的学生,比如高中生,大学生,学习方法是不完全相同的。那么此时为了解决这个问题,我们可以将子类从父类继承过来的方法重新写方法体,我们叫做方法的重写,重写方法,不用改变方法名,只需要重写方法体即可。

 

4.多态的理解

     多态是指由于继承和重写机制,相同类型的对象,调用相同的方法,得到的结果可能不一样。

这个很好理解吧!比如上述所举的例子,高中生对象和大学生对象我们都可以认为是学生对象,但是由于各自类中可能重写了study()方法,所以导致调用study()方法结果就可能不同。

 

5.接口

(1)什么是接口 

刚在我们讲到了子类与父类,我们说父类里的方法相较于子类是十分抽象笼统的,现在不妨把我们的思想扩宽,假设父类里的方法无限抽象,以至于只有方法名,没有方法体呢?

如果一个类中所有的方法都没有方法体,这个类我们就叫做接口,接口是一种特殊的类。

接口在java中的关键字是interface,现在我们来定义一个接口,接口名称是wzqconfig,这个接口用于存储五子棋的配置,并且接口中同样可以定义属性。如下图所示:

 

java2.png

需要注意的是:

         1.接口中的属性必须是一个公共的静态常量public static final (如上图中)

         2.接口中的方法必须是一个公共的抽象方法,public abstract  (如下图)

java3.png

  其中 XXX表示所定义的方法名

 

   既然接口中的方法都是抽象方法,所以接口是不存在构造方法的,自然不能够创建对象!我们来定义一个接口,主要是给子类扩展,使得工程思路更清晰,代码更易读。

(2)接口的实现

   假设我们已经定义了一个person类接口。我们知道学生算是person(人),所以当这个person类里的方法都没有方法体成为接口时,我们就可以用学生去实现这个接口。什么叫实现呢?其实这个概念和子类和父类中的继承类似,只不过在使用接口时,我们将子类得到父类中已经定义好的方法与属性这个过程叫做实现。两者本质相同,只不过在java中的关键字不同,实现的关键字是implement。而继承的关键字是extends。如下图所示:

java5.png

 需要注意的是:

       1.因为接口中的方法都是抽象的,没有任何方法体所以实现接口时,子类要重写接口中定义的所有方法。并且注意此时的方法不再是抽象的(即无需abstract关键字)

       2.接口中的方法默认都是public,即使定义接口是没有注明public,子类在实现时也必须加上public

      

 

 6.抽象类的使用

 (1)什么是抽象类

我们刚才已经讲过了接口,现在我们再来看抽象类就会比较容易,抽象类是介于接口和类之间的定义,抽象类中,可以定义已实现的方法,也可以定义像接口中没有实现的方法——但继承的子类必须实现,如下图是一个抽象类的定义

java6.png

如上图,抽象类定义时,类前需要加abstract关键字,抽象类中的方法如果没有实现(没有方法体),就必须加上abstract关键字,即抽象方法,跟子类继承抽象类,也是用extends关键字。

(2)抽象类的使用 

    刚才已经讲过,抽象类是介于接口与类的一种特殊的类,其中有已经实现的方法,也有抽象的方法,所以抽象类是不能直接拿来创建对象的。

当我们用一个子类去继承了抽象类后,对于抽象类中已经实现的方法,子类可以直接调用,但是如果是方法是抽象方法未实现时,那么在子类必须重写该方法。

 

 

7.总结:

我们在类与继承的内容中提到了子父类,继承,接口,实现,抽象类等关键名词,他们之间有许多的联系,一旦他们之间的联系弄明白了,这部分内容也就不难了。最后要提到的是,类,接口,抽象类,只有class类是可以直接拿来创建对象的。   

作者是java初学者~水平有限,难免有讲的不好的不够生动易懂的地方,望读者批评指正,感激不尽。

    

                                                        学习的路上总有困难,只要努力,即使不够聪明,也能看到曙光。

                                                          如果看不到黎明,那就再早起一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值