java class .method_在Java中,this.method()和method()之间有什么区别?

唯一重要的是如果你正在使用OuterClass.this.method()例如

class OuterClass { void method() { } class InnerClass { void method() { OuterClass.this.method(); // not the same as method(). } } }

这些结构与生成的字节码完全没有区别,因此没有性能影响。 如果没有明确定义, this在编译期间解决。

使用明确this的唯一原因是可读性 – 有些人觉得更容易阅读,因为this表明这是一个当前对象的实例方法。

另外请注意,如果method()是静态的,那么使用this是不鼓励和误导的。

private static void method() { } private void foo() { this.method(); //generates warning in my IDE for a reason }

在这种情况下,它也不会对性能产生影响。

通过在命令行中调用javap -c ClassName可以看出没有区别。 例如:

public class This { private void method() { } public void noThis() { method(); } public void useThis() { this.method(); } }

生成以下反汇编输出:

Compiled from "This.java" public class This extends java.lang.Object{ public This(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public void noThis(); Code: 0: aload_0 1: invokespecial #2; //Method method:()V 4: return public void useThis(); Code: 0: aload_0 1: invokespecial #2; //Method method:()V 4: return }

对于方法没有区别,但它可以与字段有所不同。 考虑这个代码:

private String someObject = "some value"; public String someMethod(String someObject) { //this.someObject refers to the field while //someObject refers to the parameter }

没有真正的区别 – 至less没有性能影响。 我更喜欢不写“这个” – IDE通常可以突出显示对此的调用,并且我认为当每次访问方法/字段/ …以“this”开头时,它的可读性较差。 但这确实是个人喜好的问题。

除了可读性以外,没有任何区别。 这使读者更清楚。

使用this.method()和/或this.myVar或不 – 在方法上没有区别,可能会有变数 – 但要保持一致。 我看到它遍布代码,有时我甚至看到this.m_myClassVar 。

就我个人而言,我更喜欢在我的类variables前面添加一个简单的下划线,并在我的方法参数上加上一个尾部的下划线:

public MyClass { private int _myInt; public void myMethod(final int myInt_, final int fooFactor_) { _myInt = myInt_ * fooFactor_; } }

虽然大多数IDE会清楚哪个是哪个,我发现这样做往往可以防止错误分配,并使代码的意图更清晰,IMO更易于阅读。

我使用_thisInstance.myMethod() (其中_thisInstance是对外部类的引用)或_thisInstance._myVar ,在内部类/侦听器/线程/等。 在哪里我需要清楚哪些类的调用方法和/或哪里需要引用类实例。

使用this.method()清楚地表明与该类的实例相关的函数被调用,而不是静态函数或属于另一个对象的函数。

正是那些喜欢在类中的所有成员variables上加上“m_”的C ++开发者的精神。 它使所有权明确。 我倾向于喜欢它,但是当你使用IDE来阐明使用颜色和字体的东西时,这并不重要。

你有没有试图在构造函数中做这个variables?

从理论上讲,在C ++中,由于对象还没有创build,所以没有这个。 我不确定Java的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Python 的 ast 模块来过滤 javalang.tree.MethodDeclaration 和 javalang.tree.ClassDeclaration。 具体实现可以参考下面的代码: ```python import javalang import ast class JavaNodeVisitor(ast.NodeVisitor): def __init__(self): self.class_nodes = [] self.method_nodes = [] def visit_ClassDeclaration(self, node): self.class_nodes.append(node) def visit_MethodDeclaration(self, node): self.method_nodes.append(node) def filter_java_nodes(java_code): tree = javalang.parse.parse(java_code) visitor = JavaNodeVisitor() visitor.visit(tree) return visitor.class_nodes, visitor.method_nodes ``` 使用示例: ```python java_code = """ public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); } } """ class_nodes, method_nodes = filter_java_nodes(java_code) print(class_nodes) print(method_nodes) ``` 输出结果: ``` [ClassDeclaration(modifiers=[], name='HelloWorld', extends=None, implements=[], body=[MethodDeclaration(modifiers=[public, static], type=VoidType(), name='main', parameters=[FormalParameter(modifiers=[], type=ArrayType(qualified_name='java.lang.String'), variable_declarator_id=VariableDeclaratorId(), position=<Position line=2, column=33>)], throws=[], body=Block(statements=[ExpressionStatement(expression=MethodInvocation(select=FieldAccess(target=Name(qualifier=None, identifier='System', position=<Position line=3, column=9>), name='out', position=<Position line=3, column=15>), member='println', arguments=[StringLiteral(value='Hello, World', position=<Position line=3, column=21>)], position=<Position line=3, column=8>), position=<Position line=3, column=8>)], position=<Position line=2, column=38>), position=<Position line=2, column=9>)], position=<Position line=1, column=1>)], position=<Position line=1, column=1>)] [MethodDeclaration(modifiers=[public, static], type=VoidType(), name='main', parameters=[FormalParameter(modifiers=[], type=ArrayType(qualified_name='java.lang.String'), variable_declarator_id=VariableDeclaratorId(), position=<Position line=2, column=33>)], throws=[], body=Block(statements=[ExpressionStatement(expression=MethodInvocation(select=FieldAccess(target=Name(qualifier=None, identifier='System', position=<Position line=3, column=9>), name='out', position=<Position line=3, column=15>), member='println', arguments=[StringLiteral(value='Hello, World', position=<Position line=3, column=21>)], position=<Position line=3, column=8>), position=<Position line=3, column=8>)], position=<Position line=2, column=38>), position=<Position line=2, column=9>)] ``` 可以看到,我们成功地过滤出了 Java 代码的类和方法节点,并返回了它们的列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值