2012-04-15 11 views
2

Ist alles in Java ein Objekt, so wie es in Ruby ist?Java und Ruby: "Alles ist ein Objekt" in OO?

Bücher, Tutorials, alles sagt "alles in Ruby ist ein Objekt", aber ist das für objektorientierte Sprachen üblich?

Ist alles ein Objekt auch Java, oder ist objektorientiert nur ein Paradigma der Programmierung, und es bedeutet nicht, dass alles ein Objekt ist oder wertet?

+4

FWIW nicht alles in Ruby ist ein Objekt, aber Werte sind. Dinge wie "wenn" sind nicht. –

+0

"Objektorientiert" scheint so viele Bedeutungen zu haben wie es Leute zu fragen gibt, oder mehr. Seltsam, wie es von Peter Wegner in OOPSLA schon 1987 genau definiert wurde. – EJP

Antwort

10

Nr

Soweit Werte zu gehen, der "Urtyp" (int, bool, float, etc.) in Java sind nicht Objekte. In Ruby sind sie Objekte. (In einigen Ruby-Implementierungen sind Fixnums intern "Werttypen" für die Leistung, aber extern sind sie als "echte" Objekte behandelbar, die über Methoden verfügen).

Darüber hinaus gibt es andere Dinge, die Objekte in Ruby sind, die keine Objekte in Java sind, z. B. Klassen. (Eigentlich Java macht diese als Class auch, aber in einem anderen Sinne.)

Es gibt einige Dinge, die keine Objekte in beiden Sprachen sind, wie Variablen und Methoden. (Obwohl in Ruby ist es einfach, ein Objekt zu erhalten, die eine bestimmte Methode darstellt.)

Wie dem auch sei, ich denke, das größere Bild ist, dass die Object Oriented programming paradigm präsentiert eine Weise zur Gruppierung von Daten und Operationen an den Daten. (Dies geschieht im Allgemeinen durch Instanzmethoden, wie in Java und Ruby, obwohl es möglicherweise auch durch multiple Versand und andere Sprachen, wie Haskell, die "non-OO" ist, bieten alternative Ansätze für diese Aufgabe.)

Oftmals enthält die Definition von "OO" auch "Vererbung", "Verkapselung", "Abstraktion" und andere alberne Lehrbuchbegriffe, aber die Verwendung und Muster von verschiedenen "OO" -Sprachen können stark variieren und überlagern sich in "non-OO" -Sprachen ;-)

+0

Methoden sind eine Art von Objekten: 'Object.instance_method (: to_s)'. Zum Beispiel: 'Object.instance_method (: to_s) .bind ([]). Call' ist nicht das gleiche wie' [] .to_s', obwohl beide eine * to_s' Methode für '[]' aufrufen. Ich bin mir allerdings nicht ganz sicher, ob das wirklich zählt, denn Methoden zur Verfügung zu stellen sind Objekte - vielleicht nur, dass sie * sein können. –

+0

@AndrewMarshall In der Tat. Methoden können in Ruby durch Objekte relativ einfach dargestellt werden und 'instance_method' holt das Methoden-Objekt, das die * message *': to_s' für die gegebene Klasse repräsentiert ... Ich bin mir aber nicht sicher, wie die verschiedenen Implementierungen heutzutage funktionieren wie die Methoden intern behandelt werden. (Dieser Aspekt von Ruby - "Message Passing" - funktioniert im Gegensatz zu JavaScript oder Python, bei dem Methoden wirklich * erstklassige * Funktionsobjekte sind, die aufgelöst werden, bevor sie aufgerufen werden.) –

+0

Richtig, und natürlich Java in welche Methoden können niemals als Objekte behandelt werden, und stattdessen haben Sie seltsame Dinge wie anonyme Klassen, die Methoden enthalten (normalerweise mit Namensanforderungen für den gegebenen Kontext). Ich persönlich denke, Java's anonyme Klassen sind ein schrecklicher Ersatz für Lambdas. –