2022-10-02 16:27:38

super

super代表的是“当前对象(this)”的父类型特征

概念

1、super是一个关键字,全部小写。

2、super和this对比着学习。

  this:

    this能出现在实例方法和构造方法中。

    this的语法是:”this.“,”this()“

    this不能使用在静态方法中。

    this.大部分情况下是可以省略的

   this.在区分局部变量和实例变量的时候不能省略。

public class setName(String name){
this.name=name;
}
//此时不能省略

    this()只能出现在构造方法第一行,通过当前的构造方法去调用”本类“中其他的构造方法,目的是:代码复用

  super

    super只能出现在实例方法和构造方法中。

    super的语法是:”super.“,”super()“

    super不能使用在静态方法中。

    super.大部分情况下是可以省略的

   super.在???的时候不能省略。

      父类和子类中有同名属性,或者说同样的方法,

      想在子类中访问父类的,super.,不能省略。

    super()只能出现在构造方法第一行,通过当前的构造方法去调用”父类“中其他的构造方法,目的是:创建子类对象的时候,先初始化父类特征

3、super()

  表示通过子类的构造方法调用父类的构造方法

  模拟现实生活中的这种场景:要想有儿子,需要先有父亲

4、重要结论:

  当一个构造方法第一行:

    既没有this()有没有super()的话,默认会有一个super();

    表示通过当前子类的构造方法调用父类的无参数构造方法。

    所以必须保证父类的无参数构造方法是存在的。(建议手动添加)

5、this()和super()不能共存,他们都只能出现在构造方法第一行

6、无论怎样,父类的构造方法是一定会执行的。(百分百的)

public class SuperTest{
public static void main(String [] args){
new C();
}
}
class A{
public A(){
Systemm.out.println("A的无参数构造执行1");
}
}
class B extends A{
public B(){
System.out.println("B的无参数构造执行2");
}
public B(String name){
System.out.println("B的有参数构造执行(String)3");
}
}
class C extends B{
public C(){
    this("zhangsan");
System.out.println("C的无参数构造执行4");
}
public C(String name){
    this(name,20);
System.out.println("C的有参数构造执行(String)5");
}
public C(String name,int age){
    super(name);
System.outt.println("C的有参数构造执行(String,int)6");
}
}

执行结果

A的无参数构造执行1
B的有参数构造执行(String)3
C的有参数构造执行(String,int)6
C的有参数构造执行(String)5
C的无参数构造执行4
在Java语言中不论是new什么对象,最后老祖宗的Object类的无参数构造方法一定会执行。(Object类的无参数构造方法是处于”栈顶部位“(最后调用,最先执行结束))

用法

利用super(String a,double b)实现对父类私有变量在子类的构造方法中的赋值。

1、super关键字代表的就是”当前对象“的那部分父类型特征

2、注意:虽然调用构造方法,在构造方法执行过程中一连串调用了父类的构造方法,父类的构造方法又继续向下调用它的父类方法,但是实际上对象只调用了一个。

3、super(实参)初始化当前对象的父类型特征。并不是创建新对象

,实际上对象只创建了一个。

观察以下代码:super.name 、this.name、 nampublic class SuperTest    public static void main(String[] args){


public class SuperTest{
public static void main(String[] args){
Vip v=new Vip("张三");
v.shopping();
}
}
class Customer{
String name;
public Customer(){}
public Customer(String name){
this.name==name;
}
}
class Vip extends Customer{
public Vip(){}
public Vip(String name){
super(name);
}
public void shopping(){
//this表示当前对象
System.out.println(this.name+"正在购物!");
//super表示的是当前对象的父类型特征。(super是this指向的那个对象中的一块空间)
System.out.println(super.name+"正在购物!");
//name前面如果什么也没有,自动在前面加上(引用.)<=>(this.name)
System.out.println(name+"正在购物!");
}
}

内存图如下

4、super使用时后面必须有个点

public calss Test0{
public void doSome(){
//输出:Test0@2f920f4
System.out.println(this);
//输出“引用”的时候,会自动调用引用的toString()方法。
//System.out.println(this.toString); //编译错误:需要'.'
// System.out.println(super);
}
//this和super不能使用在static静态方法中。
/*
public static void doOther(){
  System.out.println(this);
  System.out.println(super.xxx);
*/
//静态方法,主方法
public static void main(String[] args){
Test0 st =new Test0();
st.doSome();
//main方法是静态的 
//错误的
 /*System.out.println(this);
  System.out.println(super.xxx);
*/
} }

/*

通过这个测试得出的结论

  super不是引用。super也不保存内存地址,super也不指向任何对象

  super只是代表当前对象内部的那一块父类型的特征。

*/

public class Test00{
public static void main(String[] arfs){
Cat c=new Cat();
c.yidong();
}
} class Animal{
public void move(){
System.out.println("Animal move");
}
} class Cat extends Animal{
//对move进行重写
public void move(){
System.out.println("Cat move");
}
//单独编写一个子类特有的方法
public void yidong(){
this.move();
move();
//super.不仅可以访问属性,也可以访问变量
super.move();
}
}

代码输出结果

/*

Cat move

Cat move

Animal move

*/

因此:在父和子中有同名的属性,或者说有相同的方法,如果此时想在子类中访问父中的数据,必须使用“super.”加以区分。

super.属性名访问父类的属性】

super.方法名(实参)【访问父类的方法】

super(实参)【调用父类的构造方法】


 

 

super学习的更多相关文章

  1. iOS self 和 super 学习

    有人问我 这个问题 回答错了,题干大概是说 [self class] 和 [super class]打印结果 是不是一样的. 我睁着眼睛说是不一样的 .因为我明明记得 几天前 做 DFS 获取反射基类 ...

  2. Java基础学习篇---------继承

    一.覆写(重写) 1.含义:子类的定义方法.属性和父类的定义方法.属性相同时候 方法名称相同,参数相同以及参数的个数也相同,此时为覆写(重写) 扩充知识点: 覆盖:只有属性名字和方法名字相同,类型.个 ...

  3. java基础&amp;&amp;高薪面试

    董鹏老师 ,多年经验总结出 [高薪就业必备]之java基础面试题[更新中]:     第01篇       学习Java基础的目的?       第02天       java语言中有没有gotoke ...

  4. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  5. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  6. Java基础学习笔记九 Java基础语法之this和super

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  7. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  8. 1.10(java学习笔记)super关键字

    supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...

  9. Java 学习(11): 面向对象编程—继承(super,this)

    Java 继承 what: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为.子类从它的父类中继承可访问的数据域和方法,也 ...

  10. js--class类、super和estends关键词的学习笔记

    前言 JavaScript 语言在ES6中引入了 class 这一个关键字,在学习面试的中,经常会遇到面试官问到谈一下你对 ES6 中class的认识,同时我们的代码中如何去使用这个关键字,使用这个关 ...

随机推荐

  1. 洛谷 P1336 最佳课题选择 题解

    P1336 最佳课题选择 题解 状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间. 转移策略:我们一次考虑每一种论文写多少篇.假设写\(k\)篇,\(k ...

  2. win10安装mysql5.7.35教程

    前提条件:我下载的是压缩包版本5.7.35,下载地址是 https://downloads.mysql.com/archives/community/ 下载完后解压,并在如下图目录里加入data文件夹 ...

  3. SpringBoot3集成ElasticSearch

    目录 一.简介 二.环境搭建 1.下载安装包 2.服务启动 三.工程搭建 1.工程结构 2.依赖管理 3.配置文件 四.基础用法 1.实体类 2.初始化索引 3.仓储接口 4.查询语法 五.参考源码 ...

  4. 03.前后端分离中台框架 zhontai 项目代码生成器的使用

    zhontai 项目 基于 .Net7.x + Vue 等技术的前后端分离后台权限管理系统,想你所想的开发理念,希望减少工作量,帮助大家实现快速开发 后端地址:https://github.com/z ...

  5. 【LaTeX】语法(更新中)

    目录 长度 空行 空格 超链接 数学公式 段落中(隐式) 单独成段(显式) 居中,左对齐,右对齐 居中 左对齐 右对齐 参考文献配置 TODO 参考资料 中文支持参考环境配置中的 内容,在这里不做重复 ...

  6. 使用PIL为图片添加水印

    使用pillow库为图片添加文件或者图片水印 下面是我们想要添加水印的图片: 图片水印: 效果图如下: ps:对图片添加字体时,需指定字体文件,如 simsun.ttc windows中在 C:\Wi ...

  7. BZ全景可视化编辑器 (KRPano可视化编辑器, 无需编写任何代码制作全景漫游)

    软件简介 BZ全景编辑器是一款KRPano全景可视化编辑工具,下载安装即可使用,无需拥有任何KRPano代码基础,便可以制作生成精美的全景漫游作品. 官方网站: 点击进入官方网站 最新版软件下载地址: ...

  8. 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程

    一.前言 Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑.其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE ...

  9. 快速搭建云原生开发环境(k8s+pv+prometheus+grafana)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 欣宸正在为接下新的Java云原生实战系列原创 ...

  10. [最佳实践]配置sshd只允许sftp登录

    sftp 是 Secure File Transfer Protocol 的缩写,即安全文件传送协议,可为传输文件提供一种安全的加密方法. sftp 为 SSH 的一部分,由于这种传输方式使用了加密/ ...