关于Super关键字的理解

简介: 深入理解Super关键字

@[TOC](学习目录

一.super使用场景

==在继承关系中,子类的无参构造器默认super()调用父类的==
==访问父类的属性和方法==
==调用父类构造器==

二.super用法

super代表父类的引用,它用于访问父类的属性,方法,构造器
建立在继承关系之上,依照访问修饰符遵循相应的访问规则
super大部分情况下是可以省略的,子类需要访问父类时,需要显式地写出来
1.super访问父类属性:

  public void hey(){
        this.name=super.name;   
        System.out.println(name);  //输出的是父类的属性
    }

通过一个小例子展示了通过super,访问并输出了父类的name属性
这里的name数据类型是引用类型,就相当于本类中name指向的是父类所对应的属性地址,达到访问父类属性的效果
2.super访问父类方法:

    public void hey(){
        //super可以调用父类的方法不能调用private方法
        super.test100();  //test100为父类中可访问的方法
        super.test200();
        super.test300();
    }

3.访问父类构造器:

  public Person(String name, int age,double score) {
        super(name, age);  //访问父类构造器
        this.score=score;   //子类属性由子类初始化
    }

三.super使用细节

①调用父类构造器可以让我们的分工更明确,因为父类属性是继承而来,所以由父类初始化,而子类中的属性可以由子类来初始化
②当出现特殊性情况,子类中有和父类中的成员方法/属性重名时,为了访问父类成员,必须通过super来指定,这就很大程度上体现了super的作用!例如:

public class Test001 {
    public static void main(String[] args) {
        Test test=new Test();
        test.hey();
    }
}
class Test0001{
    String name="22";
}
class Test extends Test0001{
    String name ="11";
    public void hey(){
        System.out.println(super.name);
    }
}

运行结果:

22

四.super越级访问

super的访问不仅仅局限于邻近的父类,也可以是爷爷类,曾祖父类...:
访问的规则遵循就近原则
有一组继承关系CC—>BB—>AA

例如

class AA{
    int a=888;
}
class BB extends AA{
    int b=88;
}
class CC extends BB{
public void getNum() {
        System.out.println(super.a);
    }
}
public class Test {
    public static void main(String[] args) {
        CC c=new CC();
        c.getNum();
    }
}

运行结果

888

”访问了他的爷爷类“
就近原则示意图:
在这里插入图片描述

五. super与this

this super
访问本类属性,没有就从父类查找 从父类开始查找属性
访问本类中的方法,没有就从父类查找 从父类开始查找方法
调用本类构造器,必须放在构造器首行 调用父类构造器,使用时放在首行
表示当前对象 用于子类访问父类对象
相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
SQL 数据库
父类坑
父类坑
46 0
|
C#
C#方法重写
C#方法重写
61 0
|
安全 Java 编译器
C++的向上转型
在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: int a = 10.9; printf("%d\n", a); 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: float b = 10; printf("%f\n", b); 输出结果为 10.000000,编译器会自动添
|
测试技术 uml
super关键字
super关键字
55 0
为什么子类会调用父类无参的构造函数
为什么子类会调用父类无参的构造函数
|
编译器
Super关键字详解
Super关键字详解
86 0
|
编译器 定位技术
在父类的构造函数中调用虚函数为什么不能实现多态
在父类的构造函数中调用虚函数为什么不能实现多态
112 0
Zp
父类静态代码块、非静态代码块、构造方法、子类静态代码块、子类非静态代码块、子类构造方法执行顺序
父类静态代码块、非静态代码块、构造方法、子类静态代码块、子类非静态代码块、子类构造方法执行顺序
Zp
70 0
|
Android开发
构造函数与初始化块
构造函数与初始化块
155 0