首页 > 编程语言 >关于java中的super

关于java中的super

时间:2023-05-03 12:22:05浏览次数:43  
标签:调用 java value class 关于 父类 super public

首当其冲先说一下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,value,class,关于,父类,super,public
From: https://www.cnblogs.com/Link-Soul/p/17368914.html

相关文章

  • Java-方法重载
    方法重载同一个类中,多个方法的名称相同,但是形参列表不同。方法重载的形式同一个类中,方法名称相同、形参列表不同形参的个数、类型、顺序不同形参的名称无关方法重载的调用流程当程序调用一个重载方法时,编译器会根据参数列表的不同自动匹配最合适的方法,这种机制叫做方法重......
  • 关于java中的equal
    正常情况下的equal方法是比较两者之间的id。如果需要它实现其他的问题,可以通过重写这个方法。idea自带了重写equal的快捷方式。右键生成中的equals()和hashCode()就可以帮助解决这个问题。选择需要在equal中比较的项,比如需要得到id和pwd是否相同的结果,就可以只勾选他们两个。......
  • 常见问题——关于.net WebApi使用Swagger报错:HTTP Error 403.14 - Forbidden
    问题:.netWebApi项目使用Swagger报错:HTTPError403.14-Forbidden解放方案:换一个端口即可推荐——删除解决方案下的.vs文件夹,重新生成即可参考:https://stackoverflow.com/questions/34970088/swagger-gives-me-http-error-403-14-forbidden/53863456......
  • java相关
    1.java.exe是执行控制台程序,javaw.exe是执行窗口程序,javac.exe是编译程序2.javatest.helloworld执行这个类中的main3.java-cpxxx.jartest.helloworld  参数cp表示自动找jar中的main。4.eclipse中Export可以打包生成jar文件 javajar包运行main函数_jar包运行......
  • Java读取数据库表
    Java读取数据库表packagecom.easycrud.builder;importcom.easycrud.utils.PropertiesUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.sql.*;/***@BelongsProject:EasyCrud*@BelongsPackage:com.easycrud.builder*@Author:xpx......
  • java基础-流程控制语句,顺序结构、分支结构、循环结构
    一、循序结构顺序结构语句是java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行。二、分支结构-if、switch1、if的三种语法结构//1if(关系表达式){表达体内容;}//2if(关系表达式1){表达体内容;}elseif(关系表达式2){表达体内容;}//3if(......
  • java基础-原码、反码、补码
    原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。例如,56,它的原码是00111000反码:正数的补码反码是其本身,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。补码:正数的补码反码是其本身,负数的补码是在其反码的基础上+1。计算机中的存储和计算都是以补码的形式进......
  • RNA-seq最强综述名词解释&思维导图|关于RNA-seq,你想知道的都在这(续)
    前言NGS系列文章包括NGS基础、转录组分析(Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析(ChIP-seq基本分析流程)、单细胞测序分析(重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程(原理、代码和评述))、DNA甲基化分析、重测序分析、GEO数据挖掘(典型医学设计实......
  • Java代码读取properties配置文件
    读取properties配置文件packagecom.easycrud.utils;importjava.io.IOException;importjava.io.InputStream;importjava.util.Iterator;importjava.util.Map;importjava.util.Properties;importjava.util.concurrent.ConcurrentHashMap;/***@BelongsProject:E......
  • java基于springboot+vue前后端分离的超市进销存系统管理系统、超市管理系统,附源码+数
    1、项目介绍超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、商品信息管理、采购信息管理、入库信息管理、出库信息管理、销......