Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Class.function()和Object.function()之间的区别_Java_Class_Oop_Object - Fatal编程技术网

Java: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)被

在似乎无关紧要的情况下,即值是一个参数,而函数不直接在调用对象实例上运行时,调用Class.function()和object.function()之间的“隐藏”区别是什么

这可以通过一个复杂的例子来说明:

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);