java的static关键字及类加载顺序

news2024/9/22 13:39:01

Java中static可以修饰类、变量、方法甚至可以构成静态块,让我们来了解下它们各自的使用以及加载顺序吧。

基本用法

static关键字修饰类

java里面用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。

public class StaticTest {
    //static关键字修饰内部类
    public static class InnerClass{
        InnerClass(){
            System.out.println("============= 静态内部类=============");
        }
        public void InnerMethod() {
            System.out.println("============= 静态内部方法=============");
        }
    }
    public static void main(String[] args) {
        //直接通过StaticTest类名访问静态内部类InnerClass
        InnerClass inner=new StaticTest.InnerClass();
        //静态内部类可以和普通类一样使用
        inner.InnerMethod();
    }
}

如果没有用static修饰InterClass,则只能new 一个外部类实例。再通过外部实例创建内部类。

static关键字修饰方法

修饰方法的时候,其实跟类一样,可以直接通过类名来进行调用:

public class StaticMethod {
    public static void test() {
        System.out.println("============= 静态方法=============");
    };
    public static void main(String[] args) {
        //方式一:直接通过类名
        StaticMethod.test();
        //方式二:通过对象调用
        StaticMethod fdd=new StaticMethod();
        fdd.test();
    }
}

static关键字修饰变量

被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。

我们同样可以使用上面的方式进行调用变量:

public class StaticVar {
    private static String name="java技术栈";

    public static void main(String[] args) {
        //直接通过类名
        StaticVar.name;
    }
}

static关键字修饰代码块

静态代码块在类第一次被载入时执行,在这里主要是想验证一下,类初始化的顺序。

父类静态变量
父类静态代码块

子类静态变量
子类静态代码块

父类普通变量
父类普通代码块
父类构造函数

子类普通变量
子类普通代码块
子类构造函数
//首先我们定义一个父类
public class Father {
    // 父类静态变量
    public static String str1 = "father static str";
    // 父类普通变量
    public String str2 = "father common str";
    // 父类静态代码块
    static {
        System.out.println("father static block");
    }
    // 父类普通代码块
    {
        System.out.println("father common block");
    }
    // 父类构造方法
    public Father() {
        System.out.println("father constructor");
    }
}

//然后定义一个子类
public class Child extends Father {
    // 子类静态变量
    public static String str1 = "child static str";
    // 子类普通变量
    public String str2 = "child common str";
    // 子类静态代码块
    static {
        System.out.println("child static block");
    }
    // 子类普通代码块
    {
        System.out.println("child common block");
    }
    // 子类构造方法
    public Child() {
        System.out.println("child constructor");
    }
}

// 测试
public static void main(String[] args) {
        new Child();
}

输出为:

father static block
child static block
father common block
father constructor
child common block
child constructor

原理讲解

3wb8Tx.png

上图为jvm运行时数据区,静态变量存放在方法区中,并且是被所有线程所共享的。

方法区中包含的都是在整个程序中永远唯一的元素,如类信息、static变量等。

举例

定义一个类,包含静态变量、静态方法。

public class Person{
    //静态变量
    static String firstName;

    String lastName;

    public void showName(){
        System.out.println(firstName+lastName);
    }

    //静态方法
    public static void viewName(){
      System.out.println(firstName);
    }

    public static void main(String[] args) {
        Person p =new Person();
        Person.firstName = "张";
        p.lastName="三";
        p.showName();

        Person p2 =new Person();
        Person.firstName="李";
        p2.lastName="四";
        p2.showName();
    }
}
//输出。张三、李四

从内存的角度看一下:
3wxuUs.png

从上面可以看到,我们的方法在调用静态方法、变量的时候,是从方法区调用的,但是调用普通变量是从堆内存中调用的,堆内存中的成员变量lastname是随着对象的产生而产生,随着对象的消失而消失。静态变量是所有线程共享的,所以不会消失。


小结

特点

  1. static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量称之为静态变量或类变量。
  2. static修饰的成员被所有的对象共享。
  3. static优先于对象存在,因为static的成员在类的加载时初始化。
  4. static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。
  5. static修饰的数据是共享数据,对象中的变量的是特有的数据。

成员变量和静态变量的区别

  1. 生命周期的不同:

成员变量随着对象的创建而存在随着对象的回收而释放。

静态变量随着类的加载而存在随着类的消失而消失。

  1. 调用方式不同:

成员变量只能被对象调用。

静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

  1. 别名不同:

成员变量也称为实例变量。

静态变量称为类变量。

  1. 数据存储位置不同:

成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

静态使用时需要注意的事项:

  1. 静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
  2. 静态方法中不可以使用this或者super关键字。
  3. 主函数是静态的

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

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

相关文章

苹果电脑硬盘读写软件有哪些?Tuxera NTFS2023mac读写硬盘软件

格式化是将硬盘重置到初始状态或者是转换硬盘格式所需的一项重要步骤,格式化可以解决大部分用户遇到的硬盘问题,不过在进行格式化之前,大家需要提前了解格式化的具体注意事项,以避免不必要的损失。下面本文就来着重介绍磁盘格式化…

windows xp 邮件服务器漏洞溢出

缓冲区溢出攻击过程概念解释:第一步:入侵着测试目标机的25和110端口第二步:入侵着测试目标机缓冲区溢出第三步:判断目标机器是否发生缓冲区溢出第四步:得到确切缓冲区溢出位置所在的区间。第五步:得到确切缓…

基于低代码开发平台搭建的生产制造管理系统

在现代化社会中,信息化管理模式早已成为企业管理的主流趋势。尤其是随着企业信息化的程度已经成为影响企业创新、发展以和企业经济效益的重要因素之后,生产管理信息化就变得至关重要。因此,拥有一套完备的生产制造管理系统对于提高企业的工作…

Nginx安全控制

安全隔离 通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。 使用SSL对流量进行加密 常用的http请求转变成https请求,因为http协议是明文传输数据,存在…

黑马redis学习记录Ⅲ SpringDataRedis客户端

学习视频:https://www.bilibili.com/video/BV1cr4y1671t/ SpringDataRedis客户端 SpringData 是 Spring 中数据操作的模块,包含对各种数据库的集成,其中对 Redis 的集成模块就叫做 SpringDataRedis,官网地址:https://…

基于eNSP中大型校园/企业网络规划与设计_综合大作业

作者:BSXY_19计科_陈永跃BSXY_信息学院注:未经允许禁止转发任何内容基于eNSP中大型校园/企业网络规划与设计_综合大作业前言及技术/资源下载说明( **未经允许禁止转发任何内容** )一、设计topo图与设计要求(简单列举18个)二、相应…

漏洞深度分析|Apache Airflow example_bash_operator DAG 远程代码执行漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。 Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖…

Vue实现搜索关键字标红高亮加粗

博主介绍 📢点击下列内容可跳转对应的界面,查看更多精彩内容! 🍎主页:水香木鱼 🍍专栏:后台管理系统 文章目录 简介:这是一篇有关【Vue实现搜索关键字标红高亮加粗】的文章&#xf…

光流法draw_flow()函数报错

光流法draw_flow()函数报错 1 import cv22 from scipy import *3 4 5 def draw_flow(im, flow, step16):6 """ Plot optical flow at sample points7 spaced step pixels apart. """8 h, w im.shape[:2]9 y, x mgrid[step / 2…

苹果电脑pd工具箱Parallels Toolbox中文

ParallelsToolbox中文版是一款体积小巧、功能齐全的电脑系统工具箱,Parallels Toolbox将所有的功能均非常直观的展现出来了,在这里可以轻松实现驱动器清理、视频转换、桌面隐藏、锁定屏幕、音频录制等一系列操作。 专为创意人士、学生、小企业主、长期多…

这些基本语法规则你还不知道?那你的Python还没入门...

官方对Python的介绍如下:Python是一款易于学习且功能强大的编程语言。它具有高效率的数据结构,能够简单又有效地实现面向对象编程。 Python有着非广泛的应用,几乎所有大中型互联网公司都在使用Python,例如国外的Google、Youtube、…

AutoDL算力租用,Mobaxterm+Pycharm+VScode通过SSH连接远程服务器AutoDL

上干货: 一 、AutoDL算力租用平台使用 https://www.autodl.com/register?codef8e175e4-67c3-4cca-b120-09b11caaf2e6 第一步先注册,新注册的有免费十块代金劵,提供免费体验一下,本想白嫖,一体验,直接上车…

重塑感知,荣耀金洋!金洋奖两项用户体验奖项公布

11月17日,银行APP用户体验外滩峰会圆满落幕。其间,金洋奖用户体验APP Top20、金洋奖适老化及无障碍体验APP Top10两项用户体验类奖项重磅颁出,聚焦用户体验,发现和挖掘业内用户体验优秀实践案例,助力行业提升APP用户体…

已有项目与git建立连接、老项目搭建git管理

最近接手了一个已经上线很久的项目,原来都是ftp进行修改,所以谁改的改了什么都没有记录,决定给这个项目加上git。 首先由于项目在线上服务器我没有直接在线上进行git远程库的上传,所以ftp把整个项目都拉到本地之后进行的操作。 一…

prometheus安装和oracle告警配置

一、安装Prometheus 通过git下载新版本promethus mv prometheus-2.40.1.linux-amd64.tar.gz /usr/local/ cd /usr/local tar zxvf prometheus-2.40.1.linux-amd64.tar.gz cd /usr/local/prometheus-2.40.1.linux-amd64 vim prometheus.yml global:scrape_interval: 15s # S…

BDD - SpecFlow Driver Pattern 驱动模式

BDD - SpecFlow Driver Pattern 驱动模式引言Driver Pattern 的优势举例不用 Driver Pattern运用 Driver Pattern引言 前面 《 BDD - SpecFlow Page Object Model POM 》介绍了 POM 模式,用于提取 Web UI 元素封装成 Page Object 类,今天介绍另外一种 D…

电子统计台账:处理时间与名称所在行有交错的流水账格式

目录 1 新建项目 2 水平过滤模板 3 垂直过滤模板是重点 实际工作中,各种千奇百怪的事情都能遇上。本来普通格式的流水账可以处理了还挺高兴,一下子又来了这样的数据格式,居然名称前面根本没有日期这样的流水账: 这种情况还是需…

【LeetCode每日一题】——462.最小操作次数使数组元素相等 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 462.最小操作次数使数组元素相等 II 四【题目描述】…

2022NUSTCTF--web

ezProtocol web基础 POST / HTTP/1.1 Host: 43.143.7.97:28520 Pragma: no-cache Cache-Control: no-cache Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Acc…

Linux信号

目录注意信号概念用kill -l命令可以查看系统定义的信号列表信号处理常见方式概览产生信号1. 通过终端按键产生信号Core Dump2. 调用系统函数向进程发信号3. 由软件条件产生信号4. 硬件异常产生信号信号捕捉模拟一下野指针异常总结阻塞信号1. 信号其他相关常见概念2. 在内核中的…