为什么使用static的类方法不需要new

2023-05-16

文章目录

  • JAVA加载过程
    • static静态成员
    • 从static学习java编译过程
      • JVM加载顺序摘要:
      • 稍稍延申一下:
      • 对于此java给出了两个解决方案:
    • 总结static
      • 下面说说静态的特点:
      • 实例变量和类变量的区别
      • 静态的使用注意事项:
      • 静态的利弊
    • 从内存角度理解java的基础语法
    • 总结

JAVA加载过程

总觉得有无数想记录的东西但又觉得没什么需要记下来的。
但又不能坏了一周一篇的目标,再三思考下决定写一些基础干货。
基础扎实的话就会和计算机有某种共鸣——你猜测应该是什么样的,实际上计算机就是什么样的

static静态成员

这是我觉得目前以来最重要的java东西——理解静态成员。(本文不讲java实践,只讲java理论)
之前学习一直懵懵懂懂,只是学习了java的规则语法。虽然可以满足日常编程却总是提不起兴趣,缺乏创造力,没有创造力的职业我是坚决拒绝的,所以我一次又一次的从头学习java,这是我第四次从头学起了。
但是直到今天看到看到static ,仿佛和计算机有了某种共鸣,所以本文从static开始讲解java代码运行过程。

从static学习java编译过程

JVM加载顺序摘要:

  1. 加载所有类(类是默认加载的)
  2. 加载主函数(即main函数)

稍稍延申一下:

JAVA代码的加载过程简简单单的就这两步,但是还是颇有深意的。

  1. 加载所有类
    即就是说,类是在加载java代码时候就已经加载,并写入内存中的。
  2. 加载主函数
    即就是说,其他函数是不加载的。
    也就是说,其他函数只是逻辑存在,内存中并不真正的存在。
  3. 并没有加载任何对象和变量
    即所有对象都存在于逻辑中,并不存在。
    不存在的东西当然是不能调用的。同样的不能调用方法,也就丧失了方法存在的意义。

对于此java给出了两个解决方案:

  1. 实例化成员
    实例化(即就是执行new操作指令),实例化在JVM的操作就是——将执行new操作的东西(方法或者变量)写进内存中。一般来说抛开访问控制凡是内存中的东西都是可以直接调用的。
  2. 静态成员
    声明静态成员的关键字是static。JVM的操作是——在加载优先级等同于类,加载类的同时就会加载static成员。也就是说static的成员已经存在内存中了就可以进行直接调用。
    所以静态变量又称为类变量。

总结static

首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在创建对象的时候,即new 操作的时候才初始化的;

先后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员还没有被加载必然不能使用,而非static的成员是在类加载之后,通过new操作符创建对象的时候初始化,此时static 已经分配内存空间,所以可以访问!

简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成对象才产生.所以静态成员不能直接访问非静态.

下面说说静态的特点:

  1. 着类的加载而加载
    也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
  2. 先于对象的存在
    明确一点:静态是先存在的对象是后存在的
  3. 所有对象共享
  4. 以直接被类名多调用

实例变量和类变量的区别

  1. 放位置
    变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
  2. 命周期
    变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失

静态的使用注意事项:

  1. 静态方法只能访问静态成员(包括成员变量和成员方法)
    静态方法可以访问静态也可以访问非静态
  2. 态方法中不可以定义this,super关键字。
    静态优先于对象存在,所以静态方法中不可以出现this,super关键字
  3. 函数是静态的。

静态的利弊

利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份可以直接被类名所调用
弊:生命周期过长,访问出现局限性(只能访问静态)

从内存角度理解java的基础语法

首先需要理解不是java代码本身占用的空间就是内存空间。真正写入内存的也并不是java代码,只是变量。
学过汇编的人应该大致知道,基层语言只是一些指令。

  1. 为什么主函数一定是静态的
    如之前所说,不是静态的成员不会预先加载。
    假如没有static关键词:编译器会主动加载所有的类,可是加载完类之后呢?
    虽然写了很多方法,可是都是逻辑的方法并不是实际存在的方法,所以这个类这是一个摆设而已,如果不被调用的话。
    所以主函数一定得是静态的,作为整个编译的开始。
  2. 为什么需要实例化呢?
    接上,主函数加载之后,主函数需要调用其他的方法,其他类才能实现这个代码包本身的价值
    那么问题来了,怎么调用呢?
    之前说了java只能调用内存中的东西,如果不写入内存是不能调用的否则会报错。
    如果要写入内存就要执行new指令。
    所以我们调用类的方法时候需要实例化:类名 变量名 = new 构造函数();
    java中本应该是:类名 变量名 = new 类名();
    为了深入理解我一般记上面的语法。
  3. 为什么静态的方法只能调用静态的成员变量(方法)呢?
    如很上很上所说,静态优先存在于普通成员。
    只有存在的东西才能调用存在的东西。不存在的东西是不能调用不存在的东西的。
    所以静态方法只能调用静态成员。
    不过换言之,如上所说“只有存在的东西才能调用存在的东西”
    那么如果给普通成员实例化不就存在了吗?
    恭喜你已经回举一反三了。事实上就是如此。
    这就是为什么静态方法调用静态方法不用实例化,而非静态方法调用静态方法需要实例化。

总结

java运行基本过程:

  1. 加载所有类预加载,但不加载类的方法
  2. 加载所有的static成员(即就是加载主函数)
  3. 主函数里运行,主函数实例化谁就把谁写进内存。
  4. 主函数调用哪个方法就调用哪个方法。

感谢鼎鼎的鼎力相助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用static的类方法不需要new 的相关文章

  • 【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

    一 八皇后问题 八皇后问题 xff0c 一个古老而著名的问题 xff0c 是回溯算法的经典案例 该问题由国际西洋棋棋手马克斯 贝瑟尔于1848年提出 xff1a 在8 8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c
  • Linux常用命令

    nbsp nbsp 作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经70
  • 读《Java编程思想第五版》心得体会

    x1f345 Java学习路线 xff1a 搬砖工逆袭Java架构师 x1f345 简介 xff1a Java领域优质创作者 x1f3c6 CSDN哪吒公众号作者 Java架构师奋斗者 x1f4aa x1f345 扫描主页左侧二维码 xff
  • 那些优秀的程序员都在看哪些书?

    目录 一 Java 27岁生日啦1995年5月23日2004年2015年2019年2022年 二 Java核心技术 卷1 基础知识 原书第11版 xff09 Core Java 三 Java核心技术 卷2 高级特性 原书第11版 xff09
  • c++ 判断文件是否存在的几种方法

    一般方法 一般而言 xff0c 下述方法都可以检查文件是否存在 xff1a 使用ifstream打开文件流 xff0c 成功则存在 xff0c 失败则不存在以fopen读方式打开文件 xff0c 成功则存在 xff0c 否则不存在使用acc
  • Linux下c/c++头文件和库文件的查找路径

    简介 这是个相当基础的话题 xff0c 平时也觉得知道一点 如头文件会先在当前目录查找 xff0c 如果未找到会查找系统目录 但当问题出现时 xff0c 还是有点不知所措 xff0c 对所谓的 系统目录 一知半解 xff0c 很难把它们的清
  • Tars框架在windows10下安装

    依赖环境 windows版本 xff1a win7以上cmake xff1a 3 2以上mysql 4 1 17以上nvm xff1a 0 35 1以上node 12 13 0以上 分别安装vs2019 xff0c nodejs git m
  • ROS基础(一):ROS通讯之话题(topic)通讯

    目录 第一章 xff1a ROS通讯之话题 topic 通讯一 topic通讯之基础篇1 Node Master大管家2 Node节点3 message 与topic4 小结5 实例 二 topic通讯之进阶篇1 创建learn topic
  • 解决已安装numpy仍然报错ModuleNotFoundError: No module named ‘numpy‘

    简介 目前 xff0c 大多数Linux系统自带python2了 但是很多应用却需要python3 于是安装了python3 每次执行的时候 xff0c 输入python时默认启动python2 xff0c 输入python3才会启动pyt
  • opencv ImportError: libGL.so.1: cannot open shared object file: No such file or directory

    ModuleNotFoundError No module named cv2 使用opencv测试时 xff0c 发现没有安装 xff0c 报错如下 xff1a 安装一下吧 xff1a pip install opencv python
  • CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本 xff1a cmake未提供的功能而实际构建中又需要时 xff0c 如获取Linux发行版本项目构建时需要执行脚本才能完成 xff0c 如boost构建过程 有的需要shell脚本的返
  • rsync增量同步文件用法实践

    rsync rsync remote sync xff0c 远程同步 xff0c 用于在本地机器及远程机器之间同步数据 对于本地机器之内 xff0c 同步数据使用cp即可 对于本地与远程 xff0c 使用scp即可 但上面两个命令同步数据时
  • 关于职业生涯发展的一点思考

    职业类型 从学校毕业步入社会 xff0c 即正式开始了人生职业生涯发展的第一步 总括地说 xff0c 大概有以下几类职业 xff1a 当公务员 xff0c 从政创立公司 xff0c 当企业家找一份工作 xff0c 成为职员 这三条道路 xf
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式 xff0c 直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值 span class token macro property span class token directive hash s
  • c语言中 char* 和 unsigned char* 的区别浅析

    背景 最近在项目中遇到了一个编译警告 xff0c 是因为定义的变量为char xff0c 而在使用时作为函数的unsigned char 类型的参数调用 这个警告很容易避免 xff0c 但是char 和unsigned char 到底有什么
  • c语言中static关键字用法详解

    概述 static关键字在c语言中比较常用 xff0c 使用恰当能够大大提高程序的模块化特性 xff0c 有利于扩展和维护 但是对于c语言初学者 xff0c static由于使用灵活 xff0c 并不容易掌握 本文就static在c语言中的
  • linux下把进程/线程绑定到特定cpu核上运行

    概述 现在大家使用的基本上都是多核cpu xff0c 一般是4核的 平时应用程序在运行时都是由操作系统管理的 操作系统对应用进程进行调度 xff0c 使其在不同的核上轮番运行 对于普通的应用 xff0c 操作系统的默认调度机制是没有问题的
  • git中submodule子模块的添加、使用和删除

    背景 项目中经常使用别人维护的模块 xff0c 在git中使用子模块的功能能够大大提高开发效率 使用子模块后 xff0c 不必负责子模块的维护 xff0c 只需要在必要的时候同步更新子模块即可 本文主要讲解子模块相关的基础命令 xff0c
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services
  • STM32跳至硬件错误中断(HardFault_Handle) 原因及参考解决方法

    一 HardFault Handle引起的原因 1 遇到错误问题是数据类型不对 xff0c 导致该步骤永远不能执行到 xff0c 跳至硬件错误中断 xff1b 所以硬件中断可尝试查找数据类型错误 2 堆栈设置错误也会跳至hardwarefa

随机推荐

  • 时间与日期插件 -- laydate 使用方法(摘自官网)

    简单例子 xff1a function var start 61 elem 39 start 39 选择ID为START的input format 39 YYYY MM DD hh mm ss 39 自动生成的时间格式 min laydat
  • nginx部署vue项目(包括一个nginx部署多个vue项目)

    部署准备 vue项目打包 首先打开public下的index目录 xff0c 修改后台的URL地址 xff0c 如下图所示 xff1a 使用CMD xff0c 打开命令行程序 进入项目根目录 执行命令 xff1a npm run build
  • 雅可比(Jacobian)矩阵

    在向量分析中 雅可比矩阵是一阶偏导数以一定方式排列成的矩阵 其行列式称为雅可比行列式 还有 在代数几何中 代数曲线的雅可比量表示雅可比簇 xff1a 伴随该曲线的一个代数群 曲线可以嵌入其中 它们全部都以数学家卡尔 雅可比 Carl Jac
  • 粒子滤波方法入门

    例子滤波方法入门 xff1a 分析典型非线性系统数学模型 主要内容 xff1a 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 1 非线性数学模型 2 用粒子滤波的MATLAB程序简介 function output args 6
  • 关于VIO中IMU预积分的讲解

    Why VIO 转自 xff1a https zhehangt github io 2019 03 23 SLAM Basic VIOInit 首先我们先简单回顾一下为什么要做VIO xff0c 以及为什么要做VIO初始化 我们知道单目相机
  • 线程互斥量死锁,与sleep没有关联

    文章目录 死锁问题死锁原因产生死锁的几个常见场景死锁产生的四个必要条件 61 61 仅供参考互斥条件占有和等待条件不可抢占条件环路等待条件 pthread mutex lock 线程互斥量死锁 与sleep没有关联 项目上 定位死锁原因 无
  • linux下,应用程序中的全局变量与so库中的全局变量名冲突,怎么办?

    文章目录 Wl Bsymbolic 动态库与应用 如果存在同名全局变量 会如何 实现了一个动态库 xff0c 封装了一些方法 然后基于这个动态库 xff0c 实现了一个应用程序 应用程序中含有全局变量A xff0c 动态库中也含有全局变量A
  • 内存管理:分页,分段,段页结合

    内存管理 xff1a 分页 xff0c 分段 xff0c 段页结合
  • STM32 SPI 收发数据 ---规则 + 问题解析

    规则 xff1a 1 xff09 高速同步串行口 3 xff5e 4线接口 xff08 CS xff0c CLK xff0c MOSI xff0c MISO xff09 xff0c 收发独立 可同步进行 2 xff09 SPI分为主从模式
  • gazebo: ROS Control的仿真教程

    gazebo 43 ROS control 1 预备知识2 数据流3 实现动态避障的环境构建 本文主要介绍如何为仿真机器人做控制器的仿真 通过仿真控制器 xff0c 控制机器人的对应关节 1 预备知识 关于gazebo中机器人的仿真 xff
  • NuttX实时操作系统

    NuttX 是一个实时操作系统 RTOS xff0c 其重点遵从特定的标准并且尽量小型化 可伸缩良好且可适应从8位到32位单片机环境 xff0c Nuttx主要遵循的标准是 Posix和ANSI标准 其他的一些来自于Unix或者其他常规的实
  • STM32 CAN 配置、收发结构定义 留存...

    分布式系统项目需要 xff0c 这次弄个CAN总线来布局 xff0c 仅见CAN的冰山一角 本次使用扩展帧模式 STM32 对CAN的定义 库 CAN结构体定义 说明 xff1a 寄存器映射 xff1a typedef span class
  • cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)

    文章目录 SVC和PendSVSVC xff1a PendSV xff1a 操作系统 xff0c 上下文切换 实例 xff1a ucos 关于 PendSV 异常的应用 上下文切换时机 怎样满足实时性 xff1a 中断 异常处理通用模板 x
  • STM32+IAP方案 实现网络升级应用固件

    关注了这个概念有些日子了 xff0c 这段时间总算有机会实战 61 61 网络升级应用固件 xff0c 这里记录下遇到的问题 xff0c 及解决方案 原理与网上流传的串口作为传输手段 一致 xff1b 不同之处 xff0c 无非我这里使用了
  • IAR版本不兼容导致无法正常打开工程文件--解决方法

    嵌入式开发 学习过程中 xff0c 难免需要借鉴别人的工程 xff0c 但是开发环境的匹配始终是个问题 61 61 版本不匹配 无法正常的打开工程文件 一般官方标配的开发环境包括 xff1a MDKIAR 这里描述IAR环境下 xff0c
  • STM32中GPIO的8种工作模式

    概念解释 xff1a 复用功能 xff1a 即片内外设 xff0c 包括UART SPI CAN I2C等等 xff0c 开启这些外设的功能 xff0c 就是使用了系统的复用功能 复用功能有两种 xff1a 没有重映像 重映像 xff08
  • 再读 ucosII源码(邵贝贝):任务之间的通讯与同步--邮箱

    邮箱简介 xff1a 邮箱是 C OS II中另一种通讯机制 xff0c 它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量 该指针指向一个包含了特定 消息 的数据结构 为了在 C OS II中使用邮箱 xff0c 必须将O
  • 阿里云ubuntu 16.04安装图形界面

    1 VNC的安装与配置 安装之前先输入 span class pln apt span span class pun span span class kwd span class hljs keyword get span span spa
  • cmake/makefile 获取git版本信息并传入源码输出

    CMake获取git commitId CMakeLists txt cmake minimum required VERSION 2 8 project test set SRCS main cpp 执行git命令 xff0c 并把结果重
  • 为什么使用static的类方法不需要new

    文章目录 JAVA加载过程static静态成员从static学习java编译过程JVM加载顺序摘要 xff1a 稍稍延申一下 xff1a 对于此java给出了两个解决方案 xff1a 总结static下面说说静态的特点 xff1a 实例变量