Java-static那些事儿

news2024/9/21 1:51:36

static作为java中基础常用的关键字,通常用于修饰内部类,方法和变量和代码段,且具有以下特性:

  • static修饰内部类时,该类属于静态内部类,其只能访问外部的静态变量和方法
  • static修饰方法时,该方法属于静态方法,可以直接通过类名调用,而不必创建类实例
  • static修饰变量时,该变量属于静态变量,存储于常量池中
  • static修饰代码块,则该代码块会在类加载时初始化,且代码块中的逻辑多线程安全

静态内部类不会持有外部类的引用

在final那些事儿一文中,提到我们可以利用静态内部类来解决匿名Handler导致的内存泄漏问题,其根本原因在于静态内部类不会持有外部类引用,测试代码如下:

public class FatherClass {
    public FatherClass() {
        Inner inner = new Inner();
    }

    public static class Inner{

    }
}

查看FatherClass$Inner的字节码如下图所示:

1-3-4-1

可以看到在Inner构造函数内确实没有持有外部类FatherClass的引用,有朋友要问了,那么Inner类中引用外部类成员变量怎么办?编写测试代码如下:

1-3-4-2

可以看出当静态内部类引用外部类成员变量时,该变量必须是静态变量,将mAge修改为static修饰后,查看FatherClass类字节码,可以看出mAge访问标志为static且存储在常量池中。

1-3-4-3

1-3-4-4

父类的static方法可以直接被子类继承吗?

修改FatherClass代码如下所示:

public class FatherClass {
    private static int mAge = 100;
    public FatherClass() {
        Inner inner = new Inner();
    }

    public static void sayHello() {
        System.out.println("sayHello in FatherClass");
    }

    public static class Inner{
        public void increaseAge() {
            mAge = 1000;
        }
    }
}

其子类代码如下所示:

public class ChildClass extends FatherClass{}

在Main类中创建FatherClass和ChildClass对象,并调用,代码如下:

public class Main {
    public static void main(String[] args) {
        ChildClass.sayHello();
        FatherClass.sayHello();

        ChildClass childClass = new ChildClass();
        childClass.sayHello();

        FatherClass fatherClass = new ChildClass();
        fatherClass.sayHello();
    }
}

执行结果如下 :

1-3-4-5

可以看出通过ChildClass的类名或实例对象均可以访问到父类的静态方法,即子类可以继承父类的静态方法。

子类能重写父类的static方法吗?

在ChildClass中利用编辑器代码自动生成功能,去选择override父类方法,可以看出没有sayHello方法可以选择,可以看出子类是不能重写父类的静态方法,如下图所示:

1-3-4-6

子类能定义与父类静态方法同名的静态方法吗?

修改ChildClass代码如下所示:

public class ChildClass extends FatherClass{
    public static void sayHello() {
        System.out.println("sayHello in ChildClass");
    }
}

执行Main中的测试代码,结果如下:

1-3-4-7

可以看出,子类可以定义父类同名的静态方法,此时通过子类对象和子类调用的是子类声明的静态方法,当子类对象强转成父类对象或者通过父类,父类对象调用的是父类声明的静态方法。

总结

static

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

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

相关文章

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros…

【mapbox+turf.js】WebGIS空间分析系列(1)

最近在想,自己一直使用webgis做的都是可视化的内容,缺少空间分析的功能。 所以吧,最近理一下使用mapbox turf来做一些基础的空间分析功能。 大概的思路是,获取目标图层(多个图层),然后选择空…

servlet(2)—javaEE

1.获取请求数据 1.1开发前端发请求 ajax封装代码 // 参数 args 是一个 JS 对象, 里面包含了以下属性 // method: 请求方法 // url: 请求路径 // body: 请求的正文数据 // contentType: 请求正文的格式 // callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件,点击转到槽 6、根据实际需要选择对应的信号,我这里方便演示选择 clicked&a…

linux 信号量semget/semop/semctl

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 原理机制 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用:管理公司内所有员工的信息 分类:要显示每位员工的编号、姓名、岗位与职责 具体实现的功能: 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…

【Web3.0大势所趋】我看到了互联网未来的模样

前言 Web3.0 是一个越来越受到关注的话题,它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势,并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么Web3.0的技术Web3.0的优势总结 Web3.0是什么 Web3.0: 是下…

尚硅谷Kafka

Kafka 1.Kafka概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 kafka基础架构 2.快速入门2.1 kafka环境安装2.2 kafka命令行操作参数2.2.1 主题命令行操作 2.2.2 生产者命令行操作2.2.3 消费者命令行操作 3.Kafka 生产者3.1 生产者消息发送…

Vue3+Vite神器:按需引入自定义组件unplugin-vue-components

前言 我们做项目时,会封装大量的公共组件,如果我们每一个都去在maints里面引入,非常麻烦不说,代码也不优雅。所以更好的方法就是自动注册全局组件,在组件中直接使用就好。 一种方法是自己在components文件夹下新建in…

QML控件--MenuBar

文章目录 一、控件基本信息二、控件使用三、属性成员四、成员函数 一、控件基本信息 Import Statement:import QtQuick.Controls 1.4 Since:Qt 5.1 二、控件使用 MenuBar:是菜单栏,通常,菜单静态声明为菜单栏的子项&…

redis入门必会知识

Redis基础知识目录 5、sortedSet 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 一、redis是什么? Redis(Remote Dictionary Server ),即远程字典服务 ! 是一个开源的使用ANSI C语言编写…

【C++】——- 模板初阶介绍

前言: 在之前的学习中,我们已经把 C前期所需要用到的知识都给大家介绍了一遍。接下来,我们要学习的就是关于在C 中模板的基本知识,今天我带给大家的内容便是关于 模板初阶的介绍。 目录 (一) 泛型编程 &…

【Python_Opencv图像处理框架】图像形态学操作

写在前面 本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️ 写在中间 读完这篇文章后,相信您便能信手拈来下面图…

给照片换底色(python+opencv)

给照片换底色(pythonopencv) 本篇目录: 🦄 一、分析照片基本信息 🦄 二、方法一(遍历图像,将像素值点替换修改为指定颜色) 🦄 三、修改图片颜色方法二(先转…

MySQL数据库索引

目录 0.知识回顾 1.数据库约束 一.索引 1.什么是索引 2.为什么要使用索引(作用) 3.索引的使用场景 4.如何使用索引 1.查看索引 2.创建索引 3.修改索引 4.删除索引 5.索引的分类 1.使用场景不同 2.按列区分 3.按数据组织方式 二.索引的数据结构 1.HASH 2.二叉搜…

如何设计自动化测试框架?阿里P7工程师耗时一个月总结而成

目录 一、什么是自动化测试框架 二、自动化测试框架的架构设计 三、自动化测试框架的最佳实践 四、自动化测试框架的组成部分 五、自动化测试框架的设计原则 六、如何选择自动化测试框架 七、自动化测试框架实例 八、结论 一、什么是自动化测试框架 自动化测试框架是一…

UE4/5多人游戏详解(八、游戏模式和游戏状态里的函数重写,插件内地图的地址做变量,做变量让按钮出现不同状态,插件内的所有代码)

目录 这里不写在插件里面,而是在游戏模式: 头文件: Cpp文件: 更改ini文件 进入地图设置模式: 写插件里面,做一个变量: 写变量 然后更改函数MenuSet: 在子系统中做变量&…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(四)

接着同样地我们也需要完成对千兆网口ETH模块和USB2.0模块的编写,实际上和UART串口模块的设计思想大同小异,也同样地需要完成两项关键功能即识别并解析报文、接收并发送数据,千兆网口ETH和USB2.0的底层驱动在前面的例程中也详细说明了&#xf…

常用的设计模式(单例模式、工厂模式等)

1.单例模式 概述: 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造…

Centos切换jdk版本

先安装了jdk1.8的版本,需要使用jdk17的版本 1.先安装jdk17,再配置环境变量: vim ~/.bashrc 2.在最后一行添加 ##这个添加的就是路径,一定要和自己jdk安装的路径是一致的 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 3.然…