Java:Class.function()和Object.function()之间的区别
在似乎无关紧要的情况下,即值是一个参数,而函数不直接在调用对象实例上运行时,调用Class.function()和object.function()之间的“隐藏”区别是什么 这可以通过一个复杂的例子来说明:Java:Class.function()和Object.function()之间的区别,java,class,oop,object,Java,Class,Oop,Object,在似乎无关紧要的情况下,即值是一个参数,而函数不直接在调用对象实例上运行时,调用Class.function()和object.function()之间的“隐藏”区别是什么 这可以通过一个复杂的例子来说明: Character c = new Character(); boolean b = c.isDigit(c); vs 我可以看到,如果只重复使用字符而不是一堆不同的实例名,硬编码变量将更容易更改(查找/替换)。最重要的是:什么是公认的最佳实践?对于静态方法,内部c.isDigit(c)被
Character c = new Character();
boolean b = c.isDigit(c);
vs
我可以看到,如果只重复使用字符而不是一堆不同的实例名,硬编码变量将更容易更改(查找/替换)。最重要的是:什么是公认的最佳实践?对于静态方法,内部
c.isDigit(c)
被视为Character.isDigit(c)代码>
在使用引用变量调用静态方法的情况下,编译器只需用类名替换引用变量。根本没有区别。这是Java语法的一个怪癖,允许您通过实例引用调用static
方法。无论您是调用Character.isDigit
还是调用c.isDigit
,编译器都会发出相同的字节码,并且甚至不关心运行时c
是否为null
(因为c
在运行时不参与调用-因为字节码正在执行Character.isDigit
).isDigit
是一种静态方法,只能作为静态方法使用。静态成员属于类,而不属于对象。然而,Java设计人员允许我们从类的对象而不是类本身调用静态方法,因为不存在真正的歧义。也许是设计上的缺陷。我能看出这个问题和建议的重复问题之间的相似之处。然而,这个问题建立在这个答案的基础上,问什么是最佳实践。总是有差异的,即使只是在编码风格上。这是第一次。更像是“史密斯奶奶”扩展了“苹果”,甚至不在乎运行时c
是否为null
”——这很酷。@宪兵不,太可怕了。但是我们现在对此无能为力。即使在编译期间c
被声明为null
,它还能工作吗?@Gendarme:它甚至不在乎它是否是编译时常量,否:System.out.println(((字符)null).isDigit('2')代码>工作正常。因为同样,没有使用实例。所有编译器都使用实例引用作为is类型信息…如果该方法未定义为静态,则必须在实例上调用它们。不能使用类名调用非静态方法。@user58446:如果该方法不是静态的,则不能通过类名调用它。
boolean b = Character.isDigit(c);