2016-10-20 6 views
-2

In Fällen, in denen es keine Rolle zu spielen scheint, dh der Wert ist ein Parameter und die Funktion arbeitet nicht direkt auf der aufrufenden Objektinstanz, was sind die? "unter der Haube" Unterschiede zwischen dem Aufruf einer Class.function() und Object.function()?Java: Unterschied zwischen Class.function() und Object.function()

Dies kann durch ein gewundenes Beispiel erläutert werden:

Character c = new Character(); 
boolean b = c.isDigit(c); 

gegen

boolean b = Character.isDigit(c); 

Ich kann Fälle sehen, wo einfacher (Suche/Ersetzen) würde hartkodierte Variablen ändern, wenn nur Zeichen verwendet wurden, wiederholt statt einer Reihe von verschiedenen Instanznamen. WICHTIG: Was ist die akzeptierte Best Practice?

+2

'isDigit' ist eine statische Methode und sollte nur als solche verwendet werden. – QBrute

+2

Statische Member gehören zur Klasse und nicht zum Objekt. Allerdings haben uns Java-Designer erlaubt, statische Methoden von einem Objekt der Klasse anstatt von der Klasse selbst aufzurufen, da es keine echte Mehrdeutigkeit gibt. Vielleicht ein Designfehler. – Gendarme

+0

Ich kann die Ähnlichkeiten zwischen dieser Frage und der als ein Duplikat vorgeschlagen sehen. Diese Frage baut jedoch auf dieser Antwort auf, indem gefragt wird, was die beste Praxis ist. Es gibt immer Unterschiede, wenn auch nur im Codierungsstil. – user58446

Antwort

0

für statische Methoden, intern c.isDigit(c) als Character.isDigit(c); behandelt

Compiler ersetzt einfach Referenzvariable mit Klassennamen bei statischen Methoden genannt Referenzvariablen.

+0

... und wenn die Methode nicht als statisch definiert ist? – user58446

+0

dann müssen sie Instanz aufgerufen werden. Sie können nicht statische Methoden mit dem Klassennamen aufrufen. –

+0

@ user58446: Wenn die Methode nicht statisch ist, können Sie sie nicht über den Klassennamen aufrufen. –

0

Es gibt keinen Unterschied. Es ist eine Eigenart der Java-Syntax, dass Sie static Methoden über eine Instanzreferenz aufrufen dürfen. Der Compiler gibt den gleichen Bytecode unabhängig davon, ob Sie anrufen Character.isDigit oder c.isDigit, und nicht einmal egal, ob cnull zur Laufzeit ist (weil c wird im Aufruf zur Laufzeit nicht beteiligt   — weil der Bytecode Character.isDigit tut).

+0

* "und es ist nicht einmal wichtig, ob *' c' * zur Laufzeit '' null' ist. "* - das ist cool. – Gendarme

+1

@Gandarme Nein, es ist schrecklich. Aber wir können jetzt nichts dagegen tun. – biziclop

+0

Funktioniert es auch, wenn 'c' während der Kompilierzeit als" null "deklariert ist? – Gendarme

Verwandte Themen