super构造方法为什么给子类赋值_【Java学习 | Javase】super

整理自:动力节点基础讲义

super

f58dcfc32f25554bbe09441848af203c.png

概述

  • 严格来说,super其实并不是一个引用,它只是一个关键字,super代表了当前对象中从父类继承过来的那部分特征。换句话说,super其实是this的一部分,从父类继承过来的属性和方法,在内存方面使用了super关键字标记

  • super和this都可以使用在实例方法中

  • super不能使用在静态方法中,因为super代表了当前对象上的父类型特征,静态方法中没有this,肯定也不能使用super


super使用在构造方法

”super(实参列表);“是通过当前的构造方法调用父类的构造方法

  • ”super(实参列表);“调用父类构造方法时,从本质上说并不是创建一个“独立的父类对象”,而是为了完成当前对象的父类型特征的初始化操作,也是为了代码复用,使用用法见【Java学习 | Javase】继承与多态


super使用在实例方法

  • 当父类中有该实例变量,子类中又重新定义了同名的实例变量,如果想在子类中访问父类的实例变量,super不能省略,因为此时父类的实例变量被隐藏了,实例方法亦是如此

  • 总结:父类和子类中有同名实例变量或者同名实例方法,想在子类中访问父类中的实例变量或实例方法,则super不能省略,其他情况都可以省略


代码展示

1、super并不是一个单独的引用

  • 通过测试,可以看出this是单独使用的引用,而super无法输出编译器提示要输出"super.xxx",可见super不是指向某个独立的对象,也不是保存某个地址

代码

public class Test{
    public static void main(String[] args) {   
        H1 h = new H2();
        h.doSome();
    }
}

class H1{
    public void doSome() {   
        System.out.println(this);
        System.out.println(super);
    }
}

输出结果

    错误: 需要'.'
        System.out.println(super);
                                ^
    错误: 需要')'
        System.out.println(super);
                                 ^
    错误: 需要';'
        System.out.println(super);
                                  ^
    错误: 解析时已到达文件结尾
}
 ^
4 个错误

2、super不能在静态方法中使用

  • 如果是写成System.out.println(super),那么编译器会报出上面的错误而不是现在的错误

代码

public class Test{
    public static void main(String[] args) {   
        System.out.println(this);
        System.out.println(super.toString());
    }
}

输出结果

错误: 无法从静态上下文中引用非静态 变量 this
        System.out.println(this);
                           ^
错误: 无法从静态上下文中引用非静态 变量 super
        System.out.println(super.toString());
                           ^

3、静态代码块、静态变量、实例变量的综合测试

分析

  • 静态变量有顺序,故先初始化k,然后依次到t1、t2,由于实例变量的初始化在创建对象时执行,故t1和t2创建之前会先执行j。然后到i、n,接着到静态代码块,再然后到main方法。需要注意的是,执行t1、t2时由于i、n没有初始化(没执行到),故是缺省默认值

代码

public class Test{
    public static int k = 0;
    public static Test t1 = new Test("t1");
    public static Test t2 = new Test("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");
    static{
        System.out.println("静态块");  
    }
    public Test(String str){
        System.out.println((++k)+":"+str+"  i = "+i+"   n = "+n);
        ++i;
        ++n;
    }
    public static int print(String str){
        System.out.println((++k)+":"+str+"  i = "+i+"   n = "+n);
        ++n;
        return ++i;
    }
    public static void main(String[] args) {   
        new Test("init");
    }
}

输出结果

1:j     i = 0   n = 0
2:t1    i = 1   n = 1
3:j     i = 2   n = 2
4:t2    i = 3   n = 3
5:i     i = 4   n = 4
静态块
6:j     i = 5   n = 99
7:init  i = 6   n = 100      

学习没有捷径,能力增强自信,乐观有益人生!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4-存储器

【README】 1.本文总结自B站 《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 【1】概述 【1.1】存储器分类 1)按存储介质分类 1, 半导体存储器,分为 TTL&#…

坑爹的日志无法按天切割问题

转载自 坑爹的日志无法按天切割问题问题背景 线上某个新管理型系统出现了日志无法按天切割生成日志文件的问题,所有的日志都在一个日志文件里面,只有每次重启的时候才会重新生成文件。 这个管理系统使用的是 Spring Boot Logback 框架,查看了…

Asp.net 面向接口框架之应用程序上下文作用域组件

在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可)也很好扩展(操作的数据库、表、资源等都可以配置)。 但是由于当时开发的匆忙(边开发边应用),…

投票源码程序_[内附完整源码和文档] 基于JSP实现的影视创作论坛系统

摘 要随着时代的发展,互联网的出现,给传统影视行业带来的最大便利就是,方便了影视从业人员以及爱好者的交流和互动,而为用户提供一个书写影评,阅读影评以及回复影评的平台,以影评为载体来使用户感受影评、解…

5-输入输出系统IO

【README】 1.本文总结自B站 《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 【1】 IO概述 【1.1】输入输出系统的发展概况 通道(通道是netty的io多路复用的底层原理,需要重点了…

Java中的基本数据类型转换(自动、强制、提升)

转载自 Java中的基本数据类型转换(自动、强制、提升) 说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示。 重新温故了下原始数据类型,现在…

我是这样入侵 Hacking Team 的

在意大利间谍软件厂商 Hacking Team 的内部邮件和文档被曝光将近一年后,黑掉这家黑客公司的黑客公开了他如何入侵HT的完整细节。该文档于上周六在网上发布,本意是为了给黑客活动人士的一份指南。但对于安全从业人员来说,则意味着当任何企业或…

python 数据分析 书籍推荐 知乎_Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!...

原标题:Python 爬取知乎 9674 个问答,揭秘最受欢迎的 98 本书!作者 | Yura责编 | 胡巍巍高尔基这话有没有道理我不知道,咱也不敢问,主要是现在也问不了。那对我来说,读书有什么意义呢?应该也是阶…

分布式作业 Elastic-Job 快速上手指南

转载自 分布式作业 Elastic-Job 快速上手指南Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建议使用 Spring 配置文件的形式。 Elast…

7-指令系统

README】 1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 机器指令: CPU能够识别并且执行的操作命令;有可以理解为不同cpu,在生产时预设了一组…

WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA)。我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架构的应用程序案例&a…

常用的数据交换格式有哪些_高程数据格式介绍

高程数据格式介绍1 概述目前业内常用的地形数据格式有img,tif,grp及dem,其中dem在地形表达中能力最强,效果最好,本文围绕dem的数据格式进行介绍。2 DEM简介数字高程模型(Digital Elevation Model),简称DEM,是通过有限的地形高程数…

switch case 支持的 6 种数据类型

转载自 switch case 支持的 6 种数据类型那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下。 Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 语法格式如下: switc…

1-操作系统启动前的工作

【README】 1.本文总结自B站《操作系统(哈工大李治军老师)》的视频讲解,非常棒,墙裂推荐; 【1】计算机上电 1) 问题: 这神秘的黑色背后发生了什么 ?计算机是怎么工作的&#x…

傅里叶变换公式_理解1维傅里叶变换

上个学期,学习了信号与系统。虽然知道了傅里叶变换的作用以及如何使用。但是对于它的本质,也就是FT是如何探测到频率的尚有疑惑。而恰好在知乎上发现了一些很好的回答。故将这些回答整理在这。感性理解1维FT知友Heinrich写的傅里叶分析之掐死教程&#x…

ASP.NET Core的配置(3): 将配置绑定为对象

出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Options对象。我们在《ASP.NET Core的配置(1)&…

11 个简练的 Java 性能调优技巧

转载自 11 个简练的 Java 性能调优技巧想要让你的项目一直高性能运作吗?以下有一些技巧你可以拿去消除缓存瓶颈,还有一些其他的性能调优建议。 大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论。好吧&#xff…

pre1-flink理论-批处理与流处理+简单示例

【README】 1.本文包含了 批处理与流处理的代码示例; 批处理:把数据 攒在一起(或攒一段时间或攒一定内存大小),然后再处理,这叫批处理;流处理:数据每来一个就处理一个;…

python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式。分享给大家供大家参考,具体如下:表单介绍表单是HTML页面中负责数据采集功能的部件。由表单标签,表单域和表单按钮组成。通过表单,将用户输入的数据提交给服务器&am…

高级 | Java中获取类名的3种方法

转载自 高级 | Java中获取类名的3种方法获取类名的方法 Java 中获取类名的方式主要有以下三种。 getName() 返回的是虚拟机里面的class的类名表现形式。 getCanonicalName() 返回的是更容易理解的类名表示。 getSimpleName() 返回的是类的简称。 都有什么区别? 通过…