Java面向对象进阶—static

本次讲解static,主要涉及以下三点

1.static修饰的静态变量

2.static修饰的静态方法和工具类

3.static的注意事项

1.static修饰的静态变量:我们首先了解什么是static,static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。被static修饰的成员变量,叫做静态变量,特点是被该类的所有对象共享 ,调用方式有:1.类名调用,2.对象名调用;被static修饰的成员方法,叫做静态方法。来看此图中的代码,在左边的类中,teachername被定义成static String,这就代表此时这个teachername已经是一个静态变量了,在右边的测试类中,我们就可以通过类名.teachername来进行修改他的值,当然也可以用s1.teachername,如果用了s1.teachername来修改的话,在进行s2.show()的时候,teachername还是跟s1是一样的。但是不推荐用s1,s2来修改静态变量,这就是静态变量的特点。

接下来从内存方向来解释这个原理。

首先这个程序遇到main,要把整个程序放入栈中,接下来继续往后执行;第二句Student.teachername="阿伟老师"这句话,就是在堆内存中,开辟一片区域,叫做静态区,也就是静态存储的位置,存入我们的teachername;紧接着继续往后,看到了new,所以就是在堆中开辟一个对象空间,此时s1就代表着对应空间的地址,0x001;然后在后边两句话就是把对应的数进行修改,在s1.show的时候再次把方法加载进栈,然后再执行,当读取到name和age的时候,JVM会数组内和地址0X0011去找堆中的对象,在执行到teachername的时候,JVM会自动识别出他是被static修饰的静态变量,会直接去堆内存中的静态存储位置(静态区)读取共享的静态数据。

总结:被static修饰的成员变量的特点:被该类所有对象共享;不属于对象,属于类随着类的加载而加载,优先于对象存在

2.static修饰的静态方法:特点:多用在测试类和工具类中;在JavaBean类中很少会用;调用方式:类名调用(推荐) ,对象名调用。

先来讲一下什么是工具类:工具类就是帮助我们做一些事情的,但是不描述任何事物的类。

工具类需要的注意事项:

1.类名见名知意

2.私有化构造方法

3.方法定义为静态

针对工具类为什么要私有化构造方法并配合static,原因如下:

1.方便调用(无需创建对象) 方法加上 static 后,外部可以直接通过类名调用(例如 ArrayUtil.printArr(arr)),不需要先 new ArrayUtil()。这对于不依赖对象状态的通用工具逻辑来说最高效

2.节省内存(防止实例化) 工具类只提供通用的计算逻辑,类内部没有任何需要用 new 储存在堆内存中的成员变量。如果外界随意 new ArrayUtil(),会白白浪费堆内存空间。

3.强制规范(私有构造) 把构造方法声明为 private ArrayUtil(){},外界就无法通过 new 来创建该类的对象 。这是一种面向对象设计的防错机制,强制使用者只能通过 类名.静态方法 的形式来使用它。

3.static的注意事项

1.静态方法中,只能访问静态变量和静态方法:在静态方法中直接访问非静态变量,就像试图在房子还没盖好(没 new 对象)时去使用房里的家具。JVM 无法预知你指的到底属于哪个具体的堆对象,因此语法上直接禁止。

2.非静态方法和可以访问所有:此时,早到的静态资源(类加载时已就位)和后到的非静态资源(new 对象时已就位)在内存里全都在场。既然大家都在,非静态方法自然可以随意访问所有资源。

3.静态方法中没用有this关键字:静态方法属于类本身,推荐直接用 类名.静态方法() 调用,完全可以脱离对象独立运行。既然静态方法在执行时可能压根没有关联任何对象,那么代表"当前对象"的 this 引用在静态方法的栈帧里就没有任何存在的依据。通俗来讲,这个就是属于整个类的,他不单独属于任何变量。

相关推荐
xcl09256 小时前
商超智能运营实战:数据驱动提升门店效率与体验指南
java·mfc·宠物
Flynt8 小时前
OpenJDK禁AI代码半年了,现在执行得怎么样?答案是:全靠自觉
java·开源·ai编程
古法安卓13 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding15 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng16 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛17 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko17 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户31268748772021 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang21 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing21 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员