大家好,本文主要讲Java中super关键字的用法和细节。有兴趣的同学过来看看,如果对你有帮助记得收藏。
目录
前言1。超级关键字2的用法。超级关键字3的使用细节。super和this关键字的比较和总结
前言
因为Xi的疫情,我在宿舍呆了一个月。最近在复习前面学过的知识的时候,发现自己初学面向对象的时候对super关键字理解的不够深入,所以想重新学习一下Super关键字的用法和细节。
1. super关键字的用法
在Java中,super关键字有三种用法,即:
通过超级访问父类中的成员变量。属性名称。
通过超访问父类中的成员方法。方法名称(参数列表)
通过super(参数列表)访问父类的构造函数
调用父类的成员变量:
类别人员{
受保护的年龄;
}
班级学生拓展人{
public void func(){
int age=super.age//通过超级访问父类的成员变量。属性名
}
}
调用父类中的成员方法:
类别人员{
受保护的void func(){
}
}
班级学生拓展人{
public void func(){
super . func();//通过超调用父类的成员方法。方法名称
}
}
调用父类的构造函数:
类别人员{
字符串名称;
公共人物(字符串名称){
this.name=name
}
}
班级学生拓展人{
公共学生(字符串名称){
超级(名);//通过super(参数列表)调用父类的构造函数
}
}
注意:
子类不能通过super关键字访问父类中私有修饰的属性和方法,因为私有修饰的属性和方法只能在当前类内部访问。当父类的构造函数被子类的构造函数中的super关键字调用时,super关键字必须出现在构造函数的第一行,并且只能出现一次。
2. super关键字的使用细节
当我们在子类中寻找方法时,调用规则如下:
子类中有方法要调用的时候,直接调用就好了。如果子类中不存在该方法,则将向上搜索父类;如果方法存在于父类中,则调用父类中的方法;如果父类中不存在该方法,将向上搜索父类的父类,直到找到对象类。
提示:如果直到对象类才找到方法,会提示方法不存在,但是如果找到了方法但是你没有权限访问(比如方法被private修饰),会产生错误。
公共类测试扩展了Test2{
公共静态void main(String[] args) {
测试Test=new Test();
test . func 1();
}
公共void函数1(){
System.out.println(子类中的' func 1()');
func 2();
}
}
等级测试2{
公共void函数2(){
System.out.println(父类中的' func 2()');
}
}
//结果:
子类中的Func1()
父类中的Func2()
在上面的代码中,子类中的func1()方法在调用func2()方法时,会在子类中寻找func2()方法的存在,如果没有找到,会在父类中寻找func2()方法。
当我们把语句func2()放在func1()中;改为this . func 2();此时,语义没有改变,仍然会首先在子类中搜索它,如果没有找到,则在父类中搜索。
当我们把this . func 2();改为super . func 2();这个时候,语义发生了变化。如上所述,超级。方法名()调用父类中的方法,所以该语句不会检测当前类中是否存在func2()方法,只会依次检测其父类中是否存在。例如:
公共类测试扩展了Test2{
公共静态void main(String[] args) {
测试Test=new Test();
test . func 1();
}
公共void函数1(){
System.out.println(子类中的' func 1()');
super . func 2();//此处编译失败。
}
公共void函数2(){
system . out . println(word类中的' func 2()');
}
}
等级测试2{
public void func3(){
System.out.println(父类中的' func 3()');
}
}
//编译失败,说明Test2中的方法func2()无法解析。
注意:成员属性与成员方法相同。
我们已经知道,super关键字的访问不仅限于父类,甚至父类的父类,父类的父类,甚至更上一层,都可以通过super关键字访问。那么,如果同一个成员存在于子类之上的多个类中,此时使用super关键字访问哪个类成员呢?
当一个子类要访问一个上级类的成员,并且该子类的多个上级类都有这个成员时,我们就利用了super关键字的邻近原则,即访问super关键字找到的第一个成员。例如:
公共类测试扩展了Test2{
公共静态void main(String[] args) {
测试Test=new Test();
test . func 1();
}
公共void函数1(){
System.out.println(子类中的' func 1()');
super . func 2();//子类通过super关键字访问上级类中的func2()。
}
}
类Test2扩展了Test3{
公共void函数2(){
System.out.println(父类中的' func 2()');
}
}
等级测试3{
公共void函数2(){
System.out.println ('func2()'在父类的父类中);
}
}
//结果:
子类中的Func1()
父类中的Func2()
上面的代码中,子类通过super关键字访问上级类中的func2()方法,子类继承Test2,Test2继承Test3。此时,Test2和Test3中都有func2()。此时子类首先访问其父类Test2,Test2中有func2()方法,所以可以直接访问Test2中的func2()。如果Test2中没有func2(),那么它就是super。
3. super和this关键字的比较
下表列出了super关键字和this关键字之间的差异:
总结
关于Java super关键字的用法和细节的这篇文章就到这里了。关于Java super keyword的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。