谁跟我说说 this 引用 调用 自己的静态方法有啥问题?

积木 2012-06-14 09:46:08
说明白了,200分奉上,还是这样调和className.静态方法 在编译器和JVM看来是完全一样的。
没有任何的效率上的问题。
...全文
339 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO临时工Oo 2012-06-15
  • 打赏
  • 举报
回复
从友好的角度讲

静态方法属于整个类,而不某个具体的实例(this)
zqfddqr 2012-06-15
  • 打赏
  • 举报
回复
看着不爽 容易歧义 (理论上的) 我偶尔也写this的
无名老僧 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Java code

class A{

static void f(){

}

void ff(){
A a = null;
this.f();
A.f();
a.f();
}
}


此代码编译后,再用javap查看字节码
Java code

voi……
[/Quote]

3楼已经说的很详细了。
VanBaston 2012-06-15
  • 打赏
  • 举报
回复
好像都行,不过一般都建议用类名点
十四月的清晨 2012-06-15
  • 打赏
  • 举报
回复
一样一样的~~~~~~

除非有特殊需求
WinterFall 2012-06-15
  • 打赏
  • 举报
回复
this相当于一个对象,在一个类内部,constructor构造方法构造了一个对象,this.staticMethod()相当于调用,而静态方法可以直接用className.staticMethod()调用,所以两个都可以。
蘑菇頭 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

一样的
首先,在一个类内部,this.xxx()调用方法可以去掉this,即相当于xxx()调用
如果xxx是static的,那就是调用static方法,是非static的,就调用非static方法
所以this有无并没有关系,同样的一个类内部,调用静态方法,类名有无也没关系
3L已经给出javap编译成为指令的代码比较,可以看出没区别
既然在同一个类内部,this或类名,省略与否因个……
[/Quote]宝哥 说的很清楚了,this 这个东西用起来,只是个人的习惯,当然有的地方不能省……至于性能上,个人觉得没什么区别
朗晴 2012-06-15
  • 打赏
  • 举报
回复
不懂,关注:
qybao 2012-06-14
  • 打赏
  • 举报
回复
一样的
首先,在一个类内部,this.xxx()调用方法可以去掉this,即相当于xxx()调用
如果xxx是static的,那就是调用static方法,是非static的,就调用非static方法
所以this有无并没有关系,同样的一个类内部,调用静态方法,类名有无也没关系
3L已经给出javap编译成为指令的代码比较,可以看出没区别
既然在同一个类内部,this或类名,省略与否因个人编程喜好而定(当然某种情况下是不能省),编译器是不会因这些喜好而编译结果不同的,那样的话,对于编程者来说就失去了一定的自由,因为必须按照编译器的喜好去变成而不是按个人喜好编程了。
MiceRice 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
说明白了,200分奉上,还是这样调和className.静态方法 在编译器和JVM看来是完全一样的。
没有任何的效率上的问题。
[/Quote]

效率上确实没有任何差异。

我认为问题主要是容易误导别人,也就是说后来接手维护的人,看到this往往第一反应是普通成员函数,而非静态函数。那么他可能会认为该函数仅作用于当前对象,但实际上该函数可能是对这个类产生更广泛层面的影响。
brightyq 2012-06-14
  • 打赏
  • 举报
回复
调用的结果是都一样了,都完成相同的功能。
但是能过类.静态方法不需要创建对象,JVM只需要把class加载进来就可以。能过对象.静态方法肯定要创建对象。
如果多次调用,就要多次创建对象;用类.静态方法就都不需要创建对象了。
一些公用的方法可以写成static的,这样调用起来就方法,但也要考虑不用太多,毕竟静态的常驻内常,会一直占用资源,而对象用过后可以被回收掉。
RDroid 2012-06-14
  • 打赏
  • 举报
回复

class A{

static void f(){

}

void ff(){
A a = null;
this.f();
A.f();
a.f();
}
}

此代码编译后,再用javap查看字节码

void ff();
Code:
0: aconst_null
1: astore_1
2: invokestatic #16 // Method f:()V
5: invokestatic #16 // Method f:()V
8: invokestatic #16 // Method f:()V
11: return


3句不同的语句,分别通过this,通过类,通过null来调用,结果一模一样
积木 2012-06-14
  • 打赏
  • 举报
回复
楼上的兄弟,这方面有什么官方文档或者书籍能参考下吗?
我知道C++ 对于静态方法的识别,但是对Java这玩意,没做那么深的研究。
RDroid 2012-06-14
  • 打赏
  • 举报
回复
obj.staticMethod()
和Class.staticMethod()

本质上是一样的,编译器编译后也是一模一样的

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧