草庐IT

super详解

Twq 2023-03-28 原文

1.super和this的区别

    super调用的是父类的属性或方法,this是调用当前类的属性或者方法。     (1)super和this关于属性的调用


    (2)super和this关于方法的调用

(3)代表的对象不同:
        this:代表本身调用者这个对象
        super:代表父类对象的引用
(4)使用前提条件不同:
        this:在没有继承关系中也可以使用
        super:只能在继承条件下才可以使用
(5)构造方法:
        this:默认调用本类的构造器
        super:默认调用的是父类的构造器

2.构造器在继承中的调用顺序

3.有参无参在继承中的注意点

    下图子类无参构造报错的原因是:当父类写了有参构造器而没有显示定义无参构造器,则父类的有参构造器会自动干掉其无参构造器,而子类无参构造器在使用前会先调用父类的无参构造器,父类的无参被有参干掉,导致子类也无法使用无参构造器。


    以上错误有两种解决方法:
    (1)父类中重写了有参构造器之后,显示定义无参构造器
    (2)在子类中调用父类的有参构造即可。如下图:

注:若在子类中不显示写super则默认调用的是无参构造,在父类重写有参构造器的前提下,想要不报错,父类中必须显示定义无参构造器

4.super在使用时的注意点

    (1)当super调用父类的构造方法时必须在子类构造方法的第一行。     (2)super只能出现在子类的方法或构造方法中。     (3)super和this不能同时调用构造方法,因为这两都必须要在构造方法的第一行,因此不能同时在构造方法中使用。
点击查看代码
package com.Tang.oop.demo05;
public class Application {
    public static void main(String[] args) {
        Student student = new Student();
       student.test("唐");
       System.out.println("=============");
       student.test1();

    }

}



package com.Tang.oop.demo05;
//子类继承父类之后,就会拥有父类的全部方法
public class Student extends Person{
    public Student() {
        super("Twq");//影藏了super代码:调用了父类的无参构造
        System.out.println("Student无参构造执行了");
    }

    private String name="Twq";
    public void print(){
        System.out.println("Student");
    }
    public void test1(){
        print();//Student
        this.print();//Student
        super.print();//Person
    }
    public void test(String name){
        System.out.println(name);//唐
        System.out.println(this.name);//Twq
        System.out.println(super.name);//jianduan
    }
}




package com.Tang.oop.demo05;

public class Person {
    public Person(){

    }
    public Person(String name) {
        System.out.println("Person无参构造执行了");
    }

    protected String name="jianduan";
    public void print(){
        System.out.println("Person");
    }
}

有关super详解的更多相关文章

  1. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

  2. ruby-on-rails - 从对 super 的调用中清理一个 block - 2

    我正在使用ActiveAttr,它为您提供了很好的通过block选项进行初始化:person=Person.new()do|p|p.first_name='test'p.last_name='man'end但是,在包含ActiveAttr::Model的特定类中,我想绕过此功能,因为我想将该block用于其他用途。所以我们开始吧:classImperator::CommandincludeActiveAttr::ModelendclassMyCommand这失败得很惨,因为该block仍然向上传递到链中,并最终在ActiveAttr内部运行此代码:definitialize(*)sup

  3. ruby - 当前的 Ruby 方法是通过 super 调用的吗? - 2

    在运行时的方法中,有没有办法知道该方法是否已通过子类中的super调用?例如moduleSuperDetectordefvia_super?#whatgoeshere?endendclassFooincludeSuperDetectordefbarvia_super??'super!':'nothingspecial'endendclassFu"nothingspecial"Fu.new.bar#=>"super!"我如何编写via_super?,或者,如果需要,如何编写via_super?(:bar)? 最佳答案 可能有更好的方法

  4. ruby-on-rails - Rails - 父类(super class)不匹配 - 2

    玩转Rails和Controller继承。我创建了一个名为AdminController的Controller,其中一个名为admin_user_controller的子类位于/app/controllers/admin/admin_user_controller.rb这是我的routes.rbnamespace:admindoresources:admin_user#Havetheadminmanagethemhere.endapp/controllers/admin/admin_user_controller.rbclassAdminUserController应用程序/Contr

  5. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  6. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  7. ruby-on-rails - 如何从 ruby​​ 父类(super class)中的方法访问子类中的当前 __FILE__ - 2

    我希望为日志设置一个默认路径,相对于使用日志的文件路径,像这样:#/path/to/lib/bar.rbclassBardefsettings_file_pathFile.dirname(File.expand_path(__FILE__))endend#/path/to/app/models/foo.rbclassFoo理想输出:#=>/path/to/app/models实际输出:#=>/path/to/lib因为FILE引用了它写入的文件,而不是它被调用的地方,它返回bar.rb文件,但我想要这样的东西返回foo.rb文件的路径,即使该方法是在Bar中定义的。有人有什么建议吗?

  8. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  9. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  10. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

随机推荐