首当其冲先说一下super的用途和含义。他是用于调用一些被重写的方法。

这里还可以复习一下子这个重写:重写是把新的方法放在被重写的方法前面。在被重写的子类中,优先调用重写后的方法。但是如果想要调用原本未被重写的方法的话,就需要super了。

如上的代码中ChildClass为FatherClass的子类。看得出来程序先运行super.f()之后是

class FatherClass{
public int value;
public void f(){
value = 100;
System.out.println("FatherClass:value="+value);
}
}
class ChildClass extends FatherClass{ @Override
public void f() { //方法在重写的时候并不会删除原方法,而是覆盖了。
//这样的就可以通过super去调用前面被覆盖的父类方法。
super.f(); //调用父类的f
value=200;
System.out.println("ChildClass:value="+value);
System.out.println("super.value="+super.value);//可以直接调用父类的
super.f();
System.out.println("ChildClass:value="+value);
} public static void main(String[] args) {
// ChildClass C = new ChildClass();//这玩意是用ChildClass类型赋值给C,
//之后 new ChildClass是新的方法体
// C.f();等价于
new ChildClass().f(); }
}

FatherClass:value=100
ChildClass:value=200
super.value=200
FatherClass:value=100
ChildClass:value=100

 

输出的结果也是如上。可以看得出子类在继承父类的变量时,是共用的。在value被赋值为200之后,
super.value也是200,执行super.f赋值后,子类中的value也变成了100

言归正传。super默认是调用父类的构造器。在子类的构造器中的第一行中,如果没有调用super的话,
那么在这一类中 java 就会默认调用super()。
public class TestSuper2 {
public static void main(String[] args) {
new ChildClass2();
} }
class FatherClass2{
public FatherClass2(){
System.out.println("调用父类构造器");
}
}
class ChildClass2 extends FatherClass2{ }

调用父类构造器
如上的代码中,子类ChildClass2并没有任何内容,然而结果中还是调用了父类的构造器。证实了上面所说的

public class TestSuper2 {
public static void main(String[] args) {
new ChildClass2();
} }
class FatherClass2{
public FatherClass2(){
System.out.println("调用父类构造器");
}
}
class ChildClass2 extends FatherClass2{ public ChildClass2() {
    System.out.println("子类构造器");

    }
}

调用父类构造器

即便是有构造器,第一行没有写super() 仍然会调用构造方法。

那么调用一个父类的方法呢?

public class TestSuper2 {
public static void main(String[] args) {
new ChildClass2();
} }
class FatherClass2{
public FatherClass2(){
System.out.println("调用父类构造器");
}
void a(){
System.out.println("调用a方法");
}
}
class ChildClass2 extends FatherClass2{ public ChildClass2() {
super.a();
System.out.println("子类构造器");
}
}

调用父类构造器
调用a方法
子类构造器

 

答案是仍然会调用super()  (当然没有构造方法就不会调用的啦)

因此可以理解为在子类方法、构造器运行之前,会先去找父类的构造器。就如同Object类一样,

super()提供了一个为什么在运行普通类的时候,会先调用Object类的一个过程:

因为Object类是所有类的父类,有了super我们就能很好的解释Object是怎么在我们看不到的地方

被调用啦



关于java中的super的更多相关文章

  1. java中关键字super

    super关键字的作用 java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中. 主要用于以下情况:1.调用父类的方法   2.调用父类的变量  3. ...

  2. Java中的super与this解析

    好了,现在开始讨论this&super这两个关键字的意义和用法. 在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象 ...

  3. Java中关键字super与this的区别

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...

  4. 总结java中的super和this关键字

    知识点: 在java类中使用super引用父类的成分,用this引用当前对象 this可以修饰属性.构造器.方法 super可以修饰属性.构造器.方法 关于子类实例化过程中的内存分配,在下一篇博客中说 ...

  5. JAVA中的super和this关键字的使用

    一 this关键字 this关键字可以出现在构造方法和实例方法中,不能出现在静态方法中,这是因为静态方法可以用类名来调用,这时可能还没有任何对象诞生. this主要有两种用法: 1 用在构造方法中,调 ...

  6. java中的super限定

    super的用法: (1)如果需要在子类中调用父类中被覆盖的实例方法,可以用super限定来调用父类中被覆盖的方法.当然,也可以调用从父类继承的实例变量. public void callOverri ...

  7. Java中的super和this关键字——

    super与this关键字 先总结再解释: super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类. this关键字:指向自己的引用. super注意点: 1.s ...

  8. Java中的super()使用注意

    1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的 ...

  9. Java中的 super和this

    super关键字 在子类中用于表示父类对象的引用,可以在子类中调用父类中的方法的属性. super语句 --- 子类在继承父类之后,子类的构造方法中会含有一个super语句. 如果没有手动指定supe ...

  10. java中static,super,final关键字辨析

    1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...

随机推荐

  1. 初识MPC

    MPC调研报告 ​ 这是一篇关于MPC的调研报告,主要介绍了我对MPC领域的一些基础认识.全文按照这样的方式组织:第一节我介绍了什么是MPC以及MPC的起源:第二节介绍了MPC领域常用的一些符号和安全 ...

  2. System.IO.IOException:“找不到资源“views.buttonstylepage.xaml”。”

    初学作为记录(事发场景): WPFDemo的程序集中,定义了一个Views文件夹,该文件夹放一些页面Page.UI层面的东西.用Frame空间做导航的时候,始终报一个错误   //   System. ...

  3. PHP 计算一个月第一天和最后一天

    $fistday= date('Y-m-1 23:59:59'); $lastday= strtotime("$fistday+1 month -1 day");

  4. 搭建rust开发环境

    1.打开https://www.rust-lang.org/tools/install 下载64位安装器 选择第一项默认安装 安装器会下载安装rust 相关工具链,并添加path C:\Users\z ...

  5. File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent

    IDEA编译报以下错误 File encoding has not been set, using platform encoding UTF-8, i.e. build is platform de ...

  6. 如何通过C++ 将数据写入 Excel 工作表

    直观的界面.出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件.在独立的数据包含的信息量太少,而过多的数据又难以理清头绪时,制作成表格是数据管理的最有效手段之一.这样不仅可以方便 ...

  7. vsftpd2.3.4 后门笑脸漏洞

    漏洞概要 在vsftpd 2.3.4版本中,在登录输入用户名时输入:)类似于笑脸的符号,会导致服务处理开启6200后门端口,直接执行系统命令 漏洞利用 攻击机:kali 2022 msfconsole ...

  8. Less-3 和 Less-4 ')闭合绕过

    判断注入类型 测试:http://localhost/sqli-labs-master/Less-3/index.php?id=1a 正常回显,可以判断为 字符型注入 闭合字符串执行而已 SQL语句 ...

  9. (1)入门MasaFramework教程

    (1)入门MasaFramework教程 首先了解一下MasaFramework是什么 MasaFramework是一个基于.Net6.0的后端框架, 可以被用于开发Web应用程序.WPF项目.控制台 ...

  10. ECharts笔记--实现地图版的数据显示(存在bug/┭┮﹏┭┮/)

    相关描述 前几天实现了柱状图等图的数据可视化,现在就来接着实现一下"更加"形象的数据可视化吧! 具体实现如下 <%@ taglib prefix="c" ...