Java基础之static关键字

本文探讨了Java中static关键字的用途及其对内存的影响,并详细解释了为何不应过度使用静态方法,尤其是在面向对象的设计中。此外,还澄清了静态方法中的一些常见误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安排讨论班讲类和对象的时候顺便提了一下static关键字,自己又去学了一下关于这个的东西,因为一直提到平常写方法尽量不要使用静态方法,对于原因也是一知半解,就好好思考了一下这个事儿。
我们都知道,Java虚拟机在执行代码的时候内存中有四个区域,分别是堆(stack)、栈(heap)、代码区(codesegment)和数据区(datasegment)。简单理解,堆是存放对象的,栈是存放变量的,包括基本数据类型和引用变量,代码区存代码,数据区存放的就是些静态的东西了,常量、静态方法等。
所有用static修饰的东西,不管是变量也好,常量也好,方法也好,都有一个共同的特性就是可以不用通过对象来访问,直接通过类名.来访问就可以,这样在一定程度上会给程序带来很大的便利。比如全局常量,比如工具类中的常用方法,使用static来修饰之后确实便利不少,但是即便如此,在所有Java程序中还是普通方法多,这也是有原因的

  • static关键字修饰的东西会占用一定内存,如占用内存过多,将会造成溢出
  • 如果所有的方法都设为静态方法,类就没有存在的必要了,不符合面向对象的编程思想

综上两点,在什么时候使用静态方法呢?我的理解是在项目中能够经常用到的方法,比如工具类中的方法,还有要在代码执行前先执行的东西可以放在静态代码块里,普通不常用的方法还是不建议使用static来修饰。


还有一点,有学弟发来一张图片问返回值类型的事情,如图
这里写图片描述
图中红线代码覆盖了method2();我当时给他解释了返回值类型的事情,然后看到了return this;还是想着谁调用返回谁呗,当时在忙,没有顾得上好好考虑,但是之后再看这段代码,有着很严重的问题啊,首先倒数第二行是直接调用了method2方法,其次是这个方法返回的对象是this,但是问题是这是一个静态方法,又类名直接调用这个方法,如果返回this对象那指向的又应该是谁呢?还有在静态方法中直接不通过对象调用非静态方法这还是我头一次听说,回到宿舍后在IDEA写了一下这段代码是报错的,那就不是我理解的问题了,是这个书上这段代码确实是有问题的,于是问了学弟这是哪本书,答复是《Java从入门到精通》第四版,我已经快从入门到放弃了,百度找这本书的电子书找了好久没找到,第二天直接去图书馆找到学弟看这本书,翻开这一页看到上面有两行字,具体记不清楚了,但是大概意思就是这几行代码在Eclipse里面是会报错的,废话吗这不是…我就说这么权威的书里面怎么会有这么低级的错误,所以自己对于static的理解还是没有什么问题的

  • static方法中不能出现this关键字
  • static方法中不能直接调用非静态方法

所以在项目中还是慎用static,只有在工具类中才考虑静态方法吧,之后如果有更深层次的理解了再仔细考虑这句话。

Java 中的 static 关键字可以用来修饰类、方法和变量,它的作用是使得这些元素成为类级别的而非实例级别的。 1. static 变量 在 Java 中,每个实例都会拥有一份自己的成员变量,而 static 变量则是属于整个类的,所有实例共享同一份 static 变量的值。在定义 static 变量时,需要在变量前加上 static 关键字。 举个例子,下面的代码定义了一个类 A,其中包含了一个实例变量 x 和一个 static 变量 y: ``` public class A { int x; static int y; } ``` 在这里,每个 A 的实例都会有自己的 x 变量,但是它们都共享同一个 y 变量。 2. static 方法 static 方法属于类级别,可以直接通过类名调用,不需要先创建类的实例。在定义 static 方法时,需要在方法前加上 static 关键字。 举个例子,下面的代码定义了一个类 B,其中包含了一个实例方法 foo 和一个 static 方法 bar: ``` public class B { void foo() { // 实例方法 } static void bar() { // 类方法 } } ``` 在这里,foo 方法必须通过 B 的实例才能调用,而 bar 方法可以直接通过 B 类名调用。 3. static 代码块 static 代码块是在类被加载时执行的一段代码,它可以用来初始化 static 变量。static 代码块只会执行一次,且在所有实例创建之前执行。 举个例子,下面的代码定义了一个类 C,其中包含了一个 static 变量 x 和一个 static 代码块: ``` public class C { static int x; static { x = 10; } } ``` 在这里,当 C 类被加载时,static 代码块会执行一次,将 x 变量初始化为 10。 总结一下,Java 中的 static 关键字可以用来修饰类、方法和变量,它使得这些元素成为类级别的而非实例级别的。static 变量和方法可以通过类名直接访问,而 static 代码块可以用来初始化 static 变量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值