当前位置:

首页 > 编程开发 > Javastatic新手入门指南:写给看不懂static的同学

Javastatic新手入门指南:写给看不懂static的同学

static属于类而非对象,静态方法不能直接调用非静态方法,需通过对象调用。静态变量被所有对象共享,实例变量各自独立。静态代码块在类加载时执行一次,用于初始化类级别资源。理解类与对象的区别是掌握static的关键。

本文目录

    01 | 先说一个最扎心的报错

    你大概率遇到过这种红红的报错:

    public class Student {
        private String name;
    
        public void sayHi() {
            System.out.println("Hi, " + name);
        }
    
        public static void main(String[] args) {
            sayHi(); // 直接爆红
        }
    }
    

    IDE 会提示你:

    Non-static method ‘sayHi()’ cannot be referenced from a static context

    很多同学看到这句话的第一反应是:

    • 我方法就在这个类里啊,为什么不能调?
    • 这不是同一个类吗?
    • Ja va 是不是故意刁难我?

    其实不是 Ja va 针对你,是你把 “类的东西” 和 “对象的东西” 搞混了。

    02 | static 的本质,其实就一句话

    如果只让你记住一句话,那就是:

    static 是属于类的,不是属于某一个对象的。

    听起来还是有点抽象?

    换一句更生活化的说法:

    • 加了 static 的东西,像是 班级公告栏,全班同学共用
    • 没加 static 的东西,像是 你自己的笔记本,只有你一个人用

    Ja va 里很多困惑,其实都来自这里:

    你到底是在操作“整个类共用的信息”,还是在操作“某一个对象自己的信息”?

    03 | 为什么main里调用自己写的方法会报错?

    这是大一同学最经典的坑之一。

    你看这个代码,直觉上觉得能跑,但它就是报错:

    public class Student {
        public void sayHi() {
            System.out.println("Hi");
        }
    
        public static void main(String[] args) {
            sayHi(); // 报错
        }
    }
    

    为什么会这样?

    因为 main 是 static 的,它运行时 不依赖任何具体对象。

    而 sayHi() 是普通方法,它要依赖某个对象才能运行。

    换句话说:

    编译器根本不知道你说的 sayHi(),到底是谁的 sayHi()。

    你方法写在 Student 类里没错,但它其实应该是:

    • 小明的 sayHi()
    • 小红的 sayHi()
    • 还是小刚的 sayHi()?

    你没有说清楚。

    所以编译器直接拒绝你:

    你现在在 static 环境里,连对象都没有,不能直接调对象的方法。

    正确写法

    public static void main(String[] args) {
        Student s = new Student();
        s.sayHi(); // 这样才行
    }
    

    先创建对象,再通过对象调用方法。

    这样 Ja va 才知道你要调的是“这个对象的 sayHi()”。

    04 | 多个对象操作同一个变量,数据为什么互不影响?

    很多同学会问:

    我创建了两个对象,然后修改其中一个的属性,为什么另一个对象没变?

    比如这样:

    public class Student {
        String name;
    
        public Student(String name) {
            this.name = name;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Student a = new Student("小明");
            Student b = new Student("小红");
    
            a.name = "Ja va 小明";
    
            System.out.println(a.name); // Ja va 小明
            System.out.println(b.name); // 小红
        }
    }
    

    为什么 b.name 没变?

    因为 name 是 实例变量。

    它没有加 static,所以它是每个对象自己私有的。

    你可以这样理解:

    • a.name 是小明自己的笔记本
    • b.name 是小红自己的笔记本

    你在小明本子上写字,当然不会自动写到小红本子上。

    所以这不是 bug,是本来就应该这样。

    05 | 那什么时候会互相影响?

    当变量是 static 的时候。

    我们把代码改一下:

    public class Student {
        static String schoolName = "Ja va 大学";
        String name;
    
        public Student(String name) {
            this.name = name;
        }
    
        public void show() {
            System.out.println(name + " 来自 " + schoolName);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Student a = new Student("小明");
            Student b = new Student("小红");
    
            a.show();
            b.show();
    
            // 直接通过类名修改
            Student.schoolName = "面向对象学院";
    
            System.out.println("----- 修改后 -----");
    
            a.show();
            b.show();
        }
    }
    

    输出:

    小明 来自 Ja va 大学
    小红 来自 Ja va 大学
    ----- 修改后 -----
    小明 来自 面向对象学院
    小红 来自 面向对象学院
    

    你看,这次就出现“互相影响”了。

    为什么?

    因为 schoolName 是 static,它是所有对象共享的。

    它不再是某个对象自己的属性,而是整个 Student 类公共的信息。

    你改的是“公告栏”,那所有人看到的当然都会变。

    06 | 怎么判断一个东西该不该加 static?

    很多同学最怕的其实不是语法,而是不知道什么时候该用。

    给你一个特别好记的判断标准:

    先问自己三个问题

    第一,这个东西是不是只和“类本身”有关?

    如果是,通常适合 static。

    第二,这个东西是不是依赖“某个具体对象”才说得清?

    如果是,不要 static。

    第三,这个数据是不是“所有人共享”的?

    如果是共享状态,就可以考虑 static。

    常见判断举例

    • 学校名、班级名、系统配置 → 通常适合 static
    • 学生姓名、成绩、年龄 → 不适合 static
    • 数学计算、工具方法 → 通常适合 static
    • 对象自己的行为,比如“自我介绍” → 不适合 static

    一句话总结:

    如果它是“类公共的”,就可能适合 static;如果它是“对象私有的”,就不要 static。

    07 | 为什么有的代码还没进 main 就先执行了?

    有些同学第一次看到这种代码会很惊讶:

    public class Demo {
        static {
            System.out.println("静态代码块先执行");
        }
    
        public static void main(String[] args) {
            System.out.println("main 方法执行");
        }
    }
    

    输出:

    静态代码块先执行
    main 方法执行
    

    为什么 static {} 会先执行?

    因为它叫 静态代码块。

    它的作用是:在 类第一次被加载时 执行一次。

    什么时候会触发类加载?

    比如:

    • 第一次运行这个类的 main
    • 第一次使用这个类的静态成员
    • 第一次创建这个类的对象

    所以顺序很好理解:

    类先加载,然后才正式进入 main。

    那静态代码块先跑,就很合理了。

    这玩意一般拿来干嘛?

    通常用于 类级别初始化,比如:

    • 加载配置
    • 初始化共享资源
    • 打印一些类加载信息

    入门阶段你先记住一点就够了:

    static {} 是类加载时执行的,不是创建对象时执行的。

    08 | static常见的几个问题

    Q1:static 方法能不能访问非 static 变量?

    不能。

    除非你先创建对象,再通过对象访问。

    Q2:非 static 方法能不能访问 static 变量?

    可以。

    因为静态变量属于类,对象自然也能访问。

    Q3:static 方法能不能用 this?

    不能。

    this 表示当前对象,而 static 方法不一定有对象,所以不让用。

    Q4:static 方法能不能被重写?

    不能真正重写。

    子类可以写一个同名的 static 方法,但那叫 隐藏,不算多态里的重写。

    09 | 最容易踩的几个坑

    坑 1:觉得 static 方法不能调用任何方法

    不是。

    static 方法可以调用 其他 static 方法。

    只是不能直接调用非 static 方法。

    坑 2:把所有方法都习惯性加 static

    这也不对。

    如果方法明显依赖对象的数据,就不应该写成 static。

    比如“学生自我介绍”,它依赖对象的姓名,就别加 static。

    坑 3:看到 static 就想到“安静、静态、自动”

    这些翻译其实容易误导人。

    你只要记住一个意思就行:

    static = 属于类。

    10 | 结尾:先别怕,先把代码跑起来

    最后说一句大实话:

    很多新手学 static 卡住,不是因为这个知识点太难,而是刚开始接触面向对象,脑子里还没建立“类 vs 对象”的概念。

    所以不要急着背概念。

    先从真实报错开始,先看代码现象,再反过头理解为什么。

    你看懂一个报错,往往比背十个定义更有用。

    如果你是大一同学,先记住下面这句话就够了:

    static 的东西属于类,普通的东西属于对象。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    视频api接口 是什么?新手入门指南
    视频api接口 是什么?新手入门指南

    视频API接口是一组预定义规则与工具,支持在应用中集成视频功能,涵盖上传、转码、播放及分析等全流程,可显著提升开发效率。选择时需考量功能、成本、易用性与稳定性,入门可遵循注册、配置、调用等步骤,从基础功能开始实践并注重异常处理与测试。

    easydl 是什么?新手入门指南
    easydl 是什么?新手入门指南

    EasyDL是百度推出的自动化AI开发平台,旨在降低深度学习应用门槛。它提供从数据准备、模型训练到服务部署的一站式解决方案,支持计算机视觉、自然语言处理等多个方向。用户无需深入算法细节,即可构建适用于工业质检、零售盘点等场景的AI模型,高效实现应用落地。

    cfosspeed 使用入门指南
    cfosspeed 使用入门指南

    cfosspeed是一款网络优化软件,通过智能管理数据包优先级来提升网络响应速度和稳定性。它高效利用带宽,尤其适合多任务并发的家庭网络,可自动为交互流量分配高优先级以降低延迟。软件支持手动调整规则,并提供统计图表等高级功能,主要改善本地网络拥塞,但无法突破物理带宽限制。

    fastreport 是什么?新手入门指南
    fastreport 是什么?新手入门指南

    FastReport是一款面向开发者的强大报表生成工具库,用于集成到应用程序中。它提供可视化设计器,支持拖拽控件创建报表模板,并能绑定多种数据源。报表引擎可生成并导出PDF、Excel等多种格式,允许预览与交互。新手可通过安装对应版本、使用控件和绑定数据快速创建首个报表。

    easytalk轻量级即时通讯软件入门指南
    easytalk轻量级即时通讯软件入门指南

    EasyTalk是一款轻量级即时通讯软件,主打简洁高效。其安装包小、占用资源少,运行流畅。核心功能包括文字、表情、文件传输及音视频通话,注重隐私与消息管理。软件适合团队协作、老旧设备或作为备用工具,通过去除冗余功能,让用户专注于沟通本身,实现低负担的高效通讯。

    linux下载 是什么?新手入门指南
    linux下载 是什么?新手入门指南

    Linux下载指选择适合需求的发行版(如Ubuntu、LinuxMint)并从官网获取安装镜像。新手应确保从官方网站下载,制作可启动U盘,安装前备份数据并了解电脑启动设置。安装过程中可尝试或直接安装系统。

    gnu操作系统 是什么?新手入门指南
    gnu操作系统 是什么?新手入门指南

    GNU是一个旨在创建完全自由操作系统的软件集合,由理查德·斯托曼于1983年发起。其核心哲学是保障用户使用、研究、修改和分发软件的自由。GNU项目提供了操作系统所需的大部分组件,如Bash、GCC等,而Linux内核则补充了核心功能,两者结合形成GNU/Linux系统。常见的发行版如Ubuntu、Fedora等整合了这些自由软件,方便用户安装使用。

    fedora 13 是什么?新手入门指南
    fedora 13 是什么?新手入门指南

    Fedora13是2010年发布的社区驱动Linux发行版,具有里程碑意义。它引入了混合显卡支持、自动打印驱动等新特性,并实验性集成Btrfs文件系统。作为技术演进样本,其许多实验性功能为后续版本奠定基础。对于现代新手,建议直接体验最新的Fedora版本以获取更好的支持与功能。

    freebsd 是什么?新手入门指南
    freebsd 是什么?新手入门指南

    FreeBSD是一个源自BSD的完整类Unix操作系统,以其高度集成性、卓越网络性能、强大安全特性和先进ZFS文件系统著称。它采用宽松的BSD许可证,提供Ports框架和pkg包管理,便于软件定制与部署。与Linux不同,FreeBSD是内核与工具统一开发的操作系统,拥有独特的初始化系统和默认shell,广泛应用于服务器和嵌入式系统。

    android3.0 是什么?新手入门指南
    android3.0 是什么?新手入门指南

    Android3.0是谷歌于2011年专为平板电脑设计的操作系统。它彻底革新界面,引入底部系统栏、卡片式多任务和全息视觉风格,并首次采用碎片化设计以适配大屏幕。该版本虽市场应用有限,但其大屏交互理念为后续Android系统统一与发展奠定了基础。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。