Java中的静态变量&静态方法

2023-11-06

静态变量&静态方法

        静态变量又叫做类变量,静态方法又被称为类方法——均被static修饰

        未被static修饰的成员变量和方法分别被称为实例变量实例方法

(1)静态方法中不需要它所属类的任何实例就可以访问,所以在静态方法中不可以使用this关键字

(2)静态方法中不可直接访问所属类的实例变量和实例方法,但可以直接访问所属类的静态变量和静态方法

        如图所示,如果在静态方法中想要直接访问所属类的实例变量和实例方法或使用this关键字,编译器都会报错

(3)静态变量(方法)的访问方式:类名.变量名(方法名)

         实例变量(方法)需要先将类实例化后才可访问:对象名.变量名(方法名)

         如图所示,未实例化时使用“类名.变量名(方法名)”就可以直接访问静态变量(方法),但无法访问相应类的实例变量和实例方法

        如图所示,当将类实例化后,使用“对象名.变量名(方法名)”就可以直接访问实例变量(方法),但无法访问相应类的静态变量和静态方法

2023/5/15更正:实例可以访问它所属类中的所有成员(包括静态成员和非静态成员),即使用“对象名.变量名(方法名)也可以访问相应类的静态变量和静态方法,但是并不建议这样做(感谢@6de1b的批评指正)

        如图所示,通过实例访问时,IDEA并不会主动提示静态成员,这可能是因为通过实例化访问静态成员属于不规范的语法,IDE会给出警告Static member 'staticclass.method1()' accessed via instance reference,同时提示你使用类名来访问静态成员,但是程序可以正常运行,不会报错

         之所以不建议通过实例化访问静态成员,是因为这样做可能会造成一些不必要的混淆

​​​​​① 容易给人造成误解:使用实例对象访问静态成员,容易让程序员以为这个成员是非静态成员,从而可能造成理解上的偏差

② 可能会被编译器优化掉:实例对象访问静态成员可能会被编译器优化掉,导致代码逻辑不正确

        于此同时,通过实例化访问静态成员,实际上也只根据实例对应的类型声明选择静态成员,并不会关注运行时具体值,这样确实也可能带来一些不必要的困扰,具体代码可参考stackoverflow上的一个回答,代码如下所示

Why isn't calling a static method by way of an instance an error for the Java compiler? - Stack Overflowhttps://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an-error-for-the-java-co

public class Base {
    public static void foo() {
        System.out.println("Base.foo()");
    }
}
class Derived extends Base{
    public static void foo() {
        System.out.println("Derived.foo()");
    }

    public static void main(String[] args) {
        Base b = new Derived();
        b.foo(); // Prints "Base.foo()"
        b = null;
        b.foo(); // Still prints "Base.foo()"
    }
}

 (4)在内存中,实例/静态成员的存储形式大致如图

        所有静态成员共享一份内存——静态变量某种意义上具有全局性质

        而不同实例间的实例变量彼此互不干涉

详解:         

        当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址。当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。
        类方法在该类被加载到内存时,就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。 类方法的入口地址直到程序退出时才被取消。
注意:
        当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址。
        也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

总结:
        类变量和类方法与类相关联,并且每个类都会出现一次。 使用它们不需要创建对象。
        实例方法和变量会在每个类的实例中出现一次。

        以下是给出完整代码范例:

public class staticclass {
    public static int count = 0; //静态变量
    public int num =0; //非静态变量
    public static void method1(){ //静态方法
        System.out.println("正在访问静态方法(count++)....");
        System.out.println("\tpre-count = "+count);
        count++;
        //num++; //静态方法中不可以访问实例变量
        //method2();  //静态方法中不可以访问实例方法
        //System.out.println(this.num); //静态方法中不可以使用this关键字
        System.out.println("\tpst-count = "+count);
    }
    public void method2() //实例方法
    {
        System.out.println("正在访问实例方法(count+2,num+3)....");
        System.out.println("\tpre-count = "+count);
        System.out.println("\tpre-num = "+num);
        count+=2;
        num+=3;
        System.out.println("\tpst-count = "+count);
        System.out.println("\tpst-num = "+num);
    }

    public static void main(String[] args) {
        System.out.println("初始时,count = "+staticclass.count); //访问静态变量:类名+变量名
        staticclass.method1();//访问静态方法:类名+变量名
        staticclass a = new staticclass();
        System.out.println("\na未操作前,count = "+staticclass.count);
        System.out.println("         num = "+a.num);
        a.method2();
        staticclass b = new staticclass();
        System.out.println("\nb未操作前,count = "+staticclass.count);
        System.out.println("         num = "+b.num);
        b.method2();
    }
}

 运行结果如图,可印证以上三点:

        如果还有其他问题,欢迎批评指正!!!

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

Java中的静态变量&静态方法 的相关文章

  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • Jackson - 反序列化嵌套 JSON

    我有一个 JSON 字符串 其格式如下 response execution status ready report cache hit true created on 2013 07 29 08 42 42 fact cache erro
  • Google App Engine with Java - 运行 javac.exe 编译器时出错

    在 Windows XP 上 刚刚下载并解压谷歌应用程序引擎java sdk to C Program Files appengine java sdk 我已经安装了jdk C Program Files Java jdk1 6 0 20
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • Spring3/Hibernate3/TestNG:有些测试给出 LazyInitializationException,有些则没有

    前言 我在单元测试中遇到了 LazyInitializationException 的问题 而且我很难理解它 正如你从我的问题中看到的那样Spring 中的数据库会话 https stackoverflow com questions 13
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • 使用 JAD 反编译 java - 限制

    我正在尝试使用 Java 中的 JAD 反编译几个 jar 文件 我也尝试过 JD GUI 但运气更差 但出现了很多错误 一种类型 易于修复 似乎是内部类 但我也发现了这段代码 static int SWITCH TABLE atp com
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐

  • 图机器学习课程笔记4

    维生素C吃多了会上火 个人CSDN博文目录 cs224w 图机器学习 2021冬季课程学习笔记集合 目录 1 思维大纲 2 中文笔记 1 思维大纲 2 中文笔记 笔记4 提取码 8888
  • 论文检索号查询

    大家好 在我们学术研究过程中 当你取得一份好的学术成果 成功发表一篇期刊论文后 往往会在不同的场合用到 论文检索号 今天我给大家分享一下什么是论文检索号以及如何查询论文检索号 什么是论文检索号 论文检索号是在论文数据库中检索论文的具有唯一性
  • 查找相似网站的方法和地址

    描述 查找相似网站的方法和地址 网址 https www similarsites com
  • macbook 15 自动重启,一天十几次

    重启后提示消息中包含 GPUPanic cpp 127 google了一下 可能是显卡的问题 macbook 15 2010年版本 机器里面有两个显卡 一个是integrated Intel显卡 一个是NVIDA显卡 mac os在切换显卡
  • python 列表排序方法

    本文将讨论的是 如何将一个字符串组成的列表 比如 abc cba bac 按照特定的条件 比如首字母 尾字母 或者长度 灵活的排序 目录 直接排序 由一些字符串组成的 list sort 方法可以直接用来对字符串排序 a John Smit
  • 函数指针和函数指针数组

    函数指针 指向函数的指针 函数指针数组 一个数组里面存的类型是函数指针 一 函数指针的声明和调用 1 指针声明 函数指针顾名思义就是一个指向函数的指针 int Add int x int y return x y char Sub char
  • Error:Unable to start the daemon process.解决

    导入一个项目出现了以下错误 Error Unable to start the daemonprocess This problem might be caused by incorrect configuration of the dae
  • 显示等待和隐式等待

    学习显示等待和隐式等待使用 参考博客原址 https blog csdn net sinat 41774836 article details 88965281 文章目录 强制等待 sleep 隐式等待 implicitly wait 显示
  • 【Linux命令详解

    文章目录 简介 一 参数列表 二 使用介绍 1 修改用户权限 2 修改用户组权限 3 修改其他用户权限 4 同时修改多个权限 5 使用数字模式设置权限 6 递归修改目录权限 总结 简介 在Ubuntu系统中 chmod命令是一个强大的工具
  • 疯壳Android嵌入式Linux平板开发教程3-9G-sensor

    详情地址 https fengke club GeekMart views offline android 购买链接 https fengke club GeekMart su fHnaDyD1o jsp 视频地址 https fengke
  • c字符串分割成数组_leetcode第31双周赛第三题leetcode1525. 字符串的好分割数目

    leetcode1525 字符串的好分割数目 给你一个字符串 s 一个分割被称为 好分割 当它满足 将 s 分割成 2 个字符串 p 和 q 它们连接起来等于 s 且 p 和 q 中不同字符的数目相同 请你返回 s 中好分割的数目 示例 1
  • HCIP考试考哪三门你知道么?

    HCIP考试考哪三门 HCIP是华为认证中资深级别的认证 与hcia相比 它可能需要考多门考试 只有都通过了 才能获得HCIP认证 那么HCIP考试要考哪三门呢 其实 不同的方向需要通过的考试门数各不相同 有的只要通过一门 有的则是两门 最
  • kettle转换中文数据出现乱码

    在使用kettle转换数据时 有时会出现中文乱码问题 下面介绍解决办法 首先先保证你自己创建或连接的数据库是utf 8编码 1 设置DB连接 打开kettle中连接的数据库 在高级中输入set names utf8 2 再到选项中命名参数
  • Flink服务器无响应,apache-flink

    在这种情况下 我们有3个kafka主题 每个主题有50个分区 它们具有不同的消息 而所有这些消息都具有 用户名 字段 topic 1 gt Message01 String username about 50 000 messages pe
  • 分析Java线程池执行原理

    Java并发编程源码分析系列 分析Java线程池的创建 上一篇已经对线程池的创建进行了分析 了解线程池既有预设的模板 也提供多种参数支撑灵活的定制 本文将会围绕线程池的生命周期 分析线程池执行任务的过程 线程池状态 首先认识两个贯穿线程池代
  • Vue2.0 Vue脚手架 插件

    Vue当中有一个特别强大但写起来特别简单的一个东西 名字叫 插件 有什么作用 可以帮我们去增强一下Vue 先配置好项目 自己写的话 main js 项目执行npm run serve后第一个进入的 import Vue from vue i
  • maven报错‘has elapsed or updates are forced“

    使用 U强制更新参数运行maven命令
  • 少儿机器人编程有什么用

    少儿机器人编程有什么用 小孩的学习一直以来都是家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当的耐心的 会给孩子选择一些能更有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于
  • 解决Enter passphrase for key

    两种解决方案 提示 Permissions 0644 for ssh id rsa pub are too open 解决方法 使用chmod 0600 ssh id rsa pub更改将公钥权限改成 600 提示 Enter passph
  • Java中的静态变量&静态方法

    静态变量 静态方法 静态变量又叫做类变量 静态方法又被称为类方法 均被static修饰 未被static修饰的成员变量和方法分别被称为实例变量和实例方法 1 静态方法中不需要它所属类的任何实例就可以访问 所以在静态方法中不可以使用this关