实例变量/类变量与this

本文探讨了Java中使用实例对象访问类变量的问题,并提出了减少使用this关键字的建议。此外,还介绍了Java中static关键字的历史及其与C++的区别。

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

Java语言很强大,但有些强大的地方是值得商榷的,比如实例对象可以访问类变量。虽然Java语言允许我们通过实例对象去访问类变量或者方法(静态变量、静态方法,static关键字修饰),但是这样的写法非常不好:第一,这会使得程序员,尤其是初级的程序员产生理解上的错误,永远记住类变量只属于类,而且我们也没有任何理由要使用实例去访问类变量;第二,增加编译器解析成本,因为编译器会将实例访问转换成通过类访问。
凡是入了门、准备以写程序为生的同学们,我想是不会去new一个实例,然后专门用来访问类变量或方法的,因为我们很容易发现这样不友好的写法。
但是,有一个地方或许是被忽视的,那就是类中的this,可能有时候会无意识地写下这样代码:

this.staticField;
this.staticMethod();

我们知道this是当前对象,它是一个对象实例,所以当我们使用this去访问类变量或类方法时也就违背了前面提到的原则:“不要使用对象实例访问类变量或者类方法”。这可能是我们一不小心就会误用的写法。
当然,有时候我们可能定义了一个函数参数与类中的变量重名了,我们使用this是想做一个区分:使用了this的是类中定义的变量,而没有使用this的是函数传递进来的参数。此时此刻我们的注意力可能完全“集中”在区分意义上了,而忽略了类变量这个事情。
这件事也是给我自己提个醒:尽量减少使用this,因为总有方法可以不需要this就能解决问题。

下面摘抄《Java核心技术》(卷1)关于使用static关键字来表示类变量和类方法的由来。

Java中的静态域与静态方法在功能上与C++相同。但是,语法书写上却稍有所不同。在C++中,使用:: 操作符访问自身作用域之外的静态域和静态方法,如Math::PI
术语“static”有一段不寻常的历史。起初,C引入关键字static是为了表示退出一个块后仍然存在的局部变量。在这种情况下,术语“static”是有意义的:变量一直存在,当再次进入该块时仍然存在。随后,static在C中有了第二种含义,表示不能被其它文件访问的全局变量和函数。为了避免引入一个新的关键字,关键字static被重用了。最后,C++第三次重用了这个关键字,与前面赋予的含义完全不一样,这里将其解释为:属于类且不属于类对象的变量和函数。这个意义与Java完全相同。

好的,我来为您解释一下Java程序中静态变量/方法实例变量/方法的区别。我们可以通过两个StaticDemo和EXP3_4来说明这个问题。 1. StaticDemo: ```java public class StaticDemo { // 静态变量 static int staticVar = 0; // 实例变量 int instanceVar = 0; // 静态方法 static void staticMethod() { staticVar++; // 可以访问静态变量 // instanceVar++; // 不能直接访问实例变量 System.out.println("Static method called. StaticVar = " + staticVar); } // 实例方法 void instanceMethod() { staticVar++; // 可以访问静态变量 instanceVar++; // 可以访问实例变量 System.out.println("Instance method called. StaticVar = " + staticVar + ", InstanceVar = " + instanceVar); } } ``` 2. EXP3_4: ```java public class EXP3_4 { public static void main(String[] args) { StaticDemo.staticMethod(); // 调用静态方法 StaticDemo obj1 = new StaticDemo(); obj1.instanceMethod(); // 调用实例方法 StaticDemo obj2 = new StaticDemo(); obj2.instanceMethod(); // 再次调用实例方法 StaticDemo.staticMethod(); // 再次调用静态方法 } } ``` 通过这个例子,我们可以看到静态变量/方法实例变量/方法的区别: 1. 静态变量和静态方法是属于的,而不是属于某个特定对象的。它们在加载时就被创建和初始化。 2. 实例变量实例方法是属于对象的,每个对象都有自己的实例变量副本。 3. 静态方法可以直接访问静态变量,但不能直接访问实例变量(除非通过对象引用)。 4. 实例方法可以访问静态变量实例变量。 5. 静态方法可以通过名直接调用,不需要创建对象。 6. 实例方法必须通过对象来调用。 7. 静态方法中不能使用this关键字,因为它不属于任何对象。 8. 在内存中,静态变量存储在方法区,而实例变量存储在堆中。 这些区别对于理解Java面向对象编程非常重要。静态成员通常用于表示所有对象共享的属性或行为,而实例成员则用于表示每个对象特有的属性或行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值