2010-01-09 4 views
5

in PHP können Sie eine Funktion in einem globalen Bereich mit Funktion deklarieren.keine gewöhnliche "Funktion" in Java?

ist dies in Java nicht möglich? sieht so aus, als ob jede Funktion in einer Klasse als Methode ist. Also alles ist OOP in Java? kein prozeduraler Code?

+5

Sie eine Frage stellen im Durchschnitt einmal pro Stunde. Ich denke, es wäre klug, in einige Bücher zu investieren, oder die Fähigkeit zu googeln ... – Pod

Antwort

18

Die nächste Sache, die Sie zu einer "frei schwebenden" Funktion haben können, ist eine statische Funktion, die Sie als qualifiziert mit dem Klassennamen, z.

public class Foo { 
    public static void bar(){} 
} 

... anderswo

Foo.bar(); 

Sie ein bisschen syntaktischen Zucker dazu hinzufügen können, um es so aussehen zu lassen, was Sie denken:

import static Foo.bar; 

... an anderer Stelle

bar(); 
+0

Sie können die Funktion auch selbst importieren: 'importieren Sie statisches Paketname.Foo.bar;' Aber wenn Sie dies zu viel tun kann verwirrend werden. – MatrixFrog

+0

Ahh, das habe ich gemeint, danke. –

3

Ja. Sie können jedoch statische Methoden definieren, die letztendlich als Methoden innerhalb einer Klasse fungieren können, aber aufgerufen werden können, ohne eine Instanz der Klasse zu instanziieren. Das heißt, wenn Sie eine Methode bar als static in Klasse Foo definieren, dann kann es als Foo.bar() aufgerufen werden.

1

Ja, das ist richtig. Java ist streng OOP.

3

Das ist richtig, kein prozeduraler Code, alles ist ein durch eine Klasse definiertes Objekt (mit Ausnahme der wenigen primitiven Datentypen). Sie können jedoch verwenden statische Methoden:

public class MyClass { 
    public static void callMe() { 
     System.out.println("HEY"); 
    } 
} 

public class MyOtherClass { 
    public void someMethod() { 
     MyClass.callMe(); 
    } 
} 

Die JVM-basierte Sprache Scala ermöglicht es Ihnen, higher-order functions zu erstellen, die Sie sich um, als Werte weitergeben können.

+0

Cool, also ist Scala für dich der Müll der Anon-Klasse. Ich muss mich wirklich hinsetzen und * mein * Scala-Buch lesen, um zu sehen, wie viel von der Schließung, "Currying" und anderen Funktion-isch-Zeug es rollt. – Roboprog

+0

Ich habe das Buch und lesen Sie es durch, und es ist ziemlich mächtig Sprache. Ich fand jedoch, dass die Dutzende von Verknüpfungsoperatoren, die diese neuen Funktionen darstellen, etwas verwirrend und schwer zu merken sind. Ruby scheint einfacher zu sein (zu schade, dass es dynamisch und 50x langsamer ist als Java, LOL). –

+0

Ich höre immer wieder, dass Java N-mal schneller ist als Ruby. Das könnte für x + = y-Arten von Mathe-y/primitiven Sachen gelten, aber es ist NICHT was ich für einige grundlegende String-Jiggering gemessen: http://roboprogs.com/devel/2009.12.html (natürlich diese " Benchmark "verwendet nur ein paar statische Methoden, die einzigen Instanzen, die sich um den GC einer der beiden Sprachen herumschlagen, sind eingebaute Strings." – Roboprog

3

Oh ja, OO indeed. Sie können jedoch pseudoprozedurales Zeug innerhalb einer statischen Methode codieren.

3

Sie eine Methode statisch machen kann es sich um eine aufrufen, ohne ein Objekt erstellen auf

public class MyClass{ 
    public static void m(){ 
     ... 
    } 
} 


MyClass.m(); 
3

erweitern, was alle anderen sagen, wenn Sie eine Menge solcher Funktionen haben, ist es zu gruppieren sie zusammen in Klassen gemeinsam Diese sind voll von nichts als statischen Methoden, oft als "Utility-Klassen" bezeichnet. Das erste Beispiel, das mir in den Sinn kommt, ist java.lang.Math, aber es gibt Tonnen von anderen. Jede Klasse mit "Util" im Namen wird wahrscheinlich diesem Muster folgen.

-1

Nicht gut gut OOP jive. Sie können immer noch eine öffentliche statische Methode definieren und sie von überall aufrufen, wie andere bereits erwähnt haben.

0

In Java Welt müssen alle Funktionen innerhalb einer Klasse deklariert werden, egal was. Willkommen in OO world =)

0

Ja, Sie können statische Funktionen machen, äh, Methoden, aber dann müssen Sie Anrufe an ihnen hart-code. Um einen Rückruf zur Laufzeit auszuwählen, müssen Sie eine Schnittstelle (keinen Funktionszeiger, prozeduralen Typ oder Delegaten) erstellen und dann eine gefälschte Klasse (wenn auch vielleicht anonym) erstellen, um sie "zu implementieren". Viel Spaß beim Schmieden!

Oder genießen Sie die humoristische satirazation: http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html