对java语言中继承的一些理解

对于继承,我们会想到爷爷,爸爸,儿子,孙子它们之间的关系,后代继承于上一辈。在java语法中也存在继承,即子类继承于父类,比如可以列举几个类为例子来说明,学生、大学生、优秀大学生,大学生这个类可以作为学生这个类的子类,优秀大学生可以作为大学生这个类的子类。在java语法中,类的继承特点是单继承、多层次的继承,单继承是指一个子类只能有一个父类;多层次的继承是指一个子类继承于它的父类,这个子类的父类也会再继承于它发的父类,值得一提的是,在java语法中,每个类都会继承于Object类。接下来这篇文章将以几个不同的知识点来说明继承的内容。

一 、四种访问修饰符关系、父类在同包和不同包情况下所定义的方法和属性是否可以被子类或其他类直接调用。

在java语法中,类的继承用到的语法是public class 子类(也叫做派生类) extends 父类(基类 超类){}。如果子类和父类两个文件在同一个包(package)下,那么子类将会继承父类中所有的属性和方法,但私有属性和方法不能直接使用,私有属性的存取要用到set和get函数。

如上图,在父类Studentq中定义了受保护的方法study,并且把它和它的子类UNStudentq的文件没有放在一个包中,在子类UNStudentq中对父类Studentq进行调用,这里是没有报错的。

但是如上图,如果是程序所在的主函数对这里父类中受保护的方法study进行调用,这里是要报错的,因为主函数和父类同包才可以用受保护的权限。即如果父类和主函数所在类不同包,那么父类中受保护的方法是不能用的。这里要说明一下4种访问修饰符的等级排名:public > protected > default > private,这里default就是缺省,没有访问修饰符。

如上图,此时父类中定义了study,访问修饰符用的是default,这个类和子类以及主程序所在的类没有在同一个包,就出现了如图的报错。

接着在父类中定义了study,访问修饰符用的是private,这个类和子类以及主程序所在的类没有在同一个包,也会出现如图的报错。

所以如果父类和子类没有在同一个包下,父类中以public和protected为访问修饰符定义的类的属性和方法可以在子类中进行调用,而父类中以default和private为访问修饰符定义的类和属性在子类中是无法调用的;如果主函数所在类文件和父类没有在一个包下,父类中以protected、default以及private修饰的方法和属性都无法被主函数直接调用,直接调用会报错。

然后如果父类和子类同包的情况下,那么父类中以public、protected以及default为访问修饰符定义的属性和方法在子类中都可以得到继承,在主函数类中也可以调用,但如果父类中以private为访问修饰符定义了某种的属性或方法,此时这种方法和属性在子类中是无法被直接使用的,即私有属性和方法不能直接使用,私有属性的存取要用到set和get函数,如果(父类)方法是私有的,那就是不想让外部访问,此时子类或主函数所在类都无法直接调用父类中被private修饰的方法。

以图为例子说明。

上图中父类中定义了使用default为访问修饰符的方法,然后父类和子类以及主函数所在类同包,此时后两者对父类中这个方法的调用是不会报错的,自然而然当父类中使用public、protected为访问修饰符修饰某种方法或者属性时,子类和主函数所在类也可以直接调用。

然后再把访问修饰符改成private,此时子类和主函数所在类都出现了如图的报错。

综上,当父类和主函数所在类或者子类都在一个包中的时候,父类中用public、protected以及default修饰的方法和属性都可以被子类继承、被(如图情况的)主函数所在类直接调用。但如果父类中有用private修饰的属性和方法,属性需要用set或get函数存取,方法则不能被调用。

借用一张图来总结更为形象

注:新手实践时,把父类中定义的方法和属性所使用的访问修饰符都用成public即可。

二、父类中有参和无参的构造方法在子类中的继承情况分析

当我们在使用一个子类继承他的父类时,子类会继承父类所有的属性和方法,在子类的构造方法中,一定要调用一次父类的构造方法。父类中无参的构造方法会被默认调用,子类创建时不需要写就可以直接用。如果父类中的构造函数有参数类型,且只有这一种,那么子类就需要手动调用(否则会报错),这里和类内构造方法的相互调用类似,使用super关键字加上实参;如果父类中除了有参的构造方法之外还有无参的构造方法,那么子类默认会调用无参的构造方法。

如上图,在父类中只定义了有参的构造方法(父类中无参的构造方法自然会被冲掉),然后定义子类继承于这个父类,这里子类显示报错,因为找不到默认的构造方法来继承。此时我们就要用super关键字加上实参的方法来调用父类中的有参的构造方法。

如上图,父类中只定义了一种带参数的构造方法。而在子类中我们定义子类的构造方法,使用super关键字并加入了实参,最后得到了子类调用了父类带参的构造方法后的结果。

所以,当父类中部只有带参的构造方法时,父类中原有的默认的无参的构造方法不再起作用,子类中的构造方法要进行定义,并且加上了super关键字和实参。所以对于新手要养成一个良好的编程习惯,在父类中除了定义有参的构造方法,也要加上无参的构造方法。

三 方法重写

方法重写这个概念首先要知道它需要满足两个条件,第一个是两个类是有继承关系的两个类,通常是在子类中重新书写在父类中已经定义过的方法的方法体;第二点是除了要满足子类中重写的方法的访问修饰符大于等于父类,返回值类型、方法名以及参数类型(个数,顺序)也要完全一样。

在重写关于父类的方法体时,有两种情况,第一种是保留父类中原有的功能:即我们调用父类的方法,可以在方法体中写入super.方法名(),或者不定义这个方法,这两种操作都会使子类拥有和父类功能相同的方法。如下图所示

这个图中输出了父类中定义的方法体所得到的结果。

第二种是对父类中的方法添加新的功能,在子类文件中对方法体进行重新定义即可。

如上图,在子类中对父类定义的方法重新进行了定义,加入了新的功能。

四、自动转型(向上转型)和强制转型(向下转型)

1自动转型

通常我们会用A a = new A()来创建一个新的类中对象,但如果已经有了B extends A这个条件,那么A a = new B()代表着将子类B中的新对象自动向上转型至父类A中,此时我们用这个对象调用父类中的方法时,会优先看一下子类中有没有对父类中的方法进行重写,如果有重写就优先用子类中的方法体,否则才用父类中的方法。即向上转型,不能够调用子类中独有的方法,只能先在父类找,再在子类中找一下是否有优化的方法体。

如图,将子类对象向上转型为父类对象,然后调用父类中的方法study,得到的结果是子类中对该方法重写方法体后所得到的结果,即用的子类的重写后的方法得到了结果。

这里调用子类中独有的方法play会显示报错。

2强制转型

强制转型是指对该对象先进行了自动转型以后,然后使用语法将这个对象向下转型,即又回到了原来的子类。比如这里我们将子类UNStudent中的对象zms转移到了父类Student中,然后可以用这样一句代码重新将zms赋值为子类新的对象zzms,即UNStudent zzms=(UNStudent)zms;

这里通过这句代码将自动转型后父类中的对象zms转移到了子类中作为新对象zzms,并执行了子类中定义的两个方法,得到了如图的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值