关于java中子类调用父类构造函数super();一些问题

2023-05-16

 来都来了,浅浅的给个赞呗!!! 



目录

浅谈java   super函数的相关概念

浅谈java构造函数相关问题        

关于子父类构造函数相关知识点:

         一,super调用构造器五个注意点:

         二,为什么子类会调用父类的构造函数呢?

         三,我们会在哪里调用父类的构造函数呢?

代码示例:

示例:父类

子类:


 浅谈java   super函数的相关概念:

       首先,要说super();这个函数,我们就要提到java中的类的继承了,而说到类的继承这个事,我们就会提到子父类这个概念,子父类就是一个类继承了另一个类,我们管被继承的这个类叫父类或者超类,主动去继承的这个类我们叫子类,或者基类,就好比儿子和爸爸一样,儿子总会继承一些爸爸的基因,比如眼睛像什么的,子类也会继承父类的部分特点,比如父类的属性(非私有)、方法(非私有),那么什么又是继承呢?就是父类中定义的属性、方法,我们可以在子类中通过父类的对象去调用,然而在子类继承父类的时候是不能继承父类的构造函数的,但是我么可以在子类的构造函数中调用父类的构造函数;调用时我们就会用到super()函数了。

浅谈java构造函数相关问题

         而如果在一个类中我们没有去手动定义一个或多个构造函数时,系统会默认的给你提供一个无参、无返回值的构造函数,

        在子类继承父类后,再给出子类的构造函数后,其实就已经在子类构造函数中隐式调用了super()函数,什么是隐式呢,就是被隐藏了。为什么隐藏呢?下面黄色字体内容就是原因。(即子类的构造函数中默认调用父类的无参构造函数,只不过第一行代码:super()一直被省略了)。

(这里省略的原因是为了保证super();一直在子类构造函数的首行,那为什么要在第一行呢?因为这个是java的规定)

          如果子类的某个构造函数想要调用父类的其他带参构造函数,在构造函数第一行添加super(参数名1,参数名2,等等);(参数的多少根据想调用父类构造函数的形参而定)

         调用父类的构造函数要放在子类的构造函数体中的第一行super(参数名1,参数名2,等等);

注意这里:子类调用父类的含参构造函数时,传递参数时没有参数类型,只有参数名。

//正确调用
super(age,name);

//错误调用
super(int age,String name);

调用了父类的其他有参构造函数,那么子类的该构造函数不会再调用父类的默认无参构造函数了,也就是说子类只能调用父类的一个构造方法。

关于子父类构造函数相关知识点:

一,super调用构造器五个注意点:

  •       我们可以在子类的构造器中显式的使用"super(形参列表)”的方式,调用父类中声明的指定的构造器,(其实你不写也可以,系统会默认隐式给你)
  •      "super(形参列表)"的使用,必须声明在子类构造器的首行!可以显式可以隐式。
  •       我们在类的构造器中,针对于"this(形参列表)"或"super(形参列表)"只能二选一,不能同时出现
  •       在构造器的首行,没有显式的声明"this(形参列表)"或"super(形参列表)",则默认调用的是父类中空参的构造
  •      在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器

 二,为什么子类会调用父类的构造函数呢?

  •      首先我们要知道构造方法是类的一个特殊成员,它会在类实例化对象时被自动调用
  •      为什么子类的构造函数中要去调用父类中的构造函数呢?因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这也是子类的实例化过程
  •      父类中存在无参构造函数,是子类存在构造函数的前提,如果父类中不存在无参构造器(由于类会默认存在一个无参构造器,此时的情况指的是父类存在有参构造器而没有显式的写出无参构造器),子类中只要存在构造器就会报错(子类默认存在的无参构造器也会报错哦)。
  •       父类存在无参构造器且有有参构造器时,子类可以只存在有参构造,在调用子类有参构造器时,会先调用父类的无参构造器。
  •       子类在实例化对象时,根据参数列表选择合适的构造函数进行初始化,子类的任何构造器被调用时都要先调用父类的无参构造函数(因为这是前提)

总结:如果存在类的继承关系:那么要想给子类添加构造函数,他的父类就必须含有无参构造函数,为什么呢?因为子类的构造函数的首行都默认隐式的调用了父类的无参构造函数,那父类都没有,你子类还调用,那坑定会报错;

三,我们会在哪里调用父类的构造函数呢?

      我们可以在子类的方法或构造器中。通过使用"super.属性”或”super.方法”的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super."
      特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性”的方式,表明调用的是父类中声明的属性。
      特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法”的方式,表明调用的是父类中被重写的方法。

代码示例:

示例:父类

public class GeometricObject {
    private String color;
    private double weight;

    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }

    public GeometricObject(){
        super();
        this.setColor("white");
        this.setWeight(1.0);
    }
    public GeometricObject(String color,double weight){
        super();
        this.color=color;
        this.weight=weight;
    }
}

子类:

public class Circle extends GeometricObject{
    private double radius;

    public Circle(){
        super();
        this.radius=1.0;
//        this.setColor("white");
//        this.setWeight(1.0);
因为父类中的构造方法中已经有this.~~就不用再重复写了,没有意义。
    }

    public Circle(double radius){
        super();
        this.radius=radius;
//        this.setColor("white");
//        this.setWeight(1.0);
因为父类中的构造方法中已经有this.~~就不用再重复写了,没有意义。
    }

    public Circle(double radius,double weight,String color){
//        super();
//        this.radius=radius;
因为父类中的构造方法中已经有this.~~就不用再重复写了,没有意义。

//        this.setWeight(weight);
//        this.setColor(color);
父类中有这两个参数的构造方法,直接就可以调用。


//        super(String color,double weight);错误的调用格式;
        super( color,weight);//正确调用格式;
        this.radius=radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于java中子类调用父类构造函数super();一些问题 的相关文章

  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet

随机推荐