Hallo,
ich hab hier Zwei Definitionen und die erste ist mir klar aber die zweite verstehe ich nicht??
Wie kann denn eine Zeichenkette als Objekt bahandelt werden???
1. Klasse ist die Menge von Objekten, die eine gemeinsame Struktur haben und ein gemeinsames Verhalten zeigen.
Objekte sind Instanzen einer oder mehrerer Klassen; Klassen existieren üblicherweise zur Übersetzungszeit, während Objekte erst zur Laufzeit erzeugt und gelöscht werden.
2. Die Zeichenketten werden als Objekte einer speziellen Klasse namens „String“ behandelt
Objekte und String
-
-
Naja eine Zeichenkette als Array von chars ist kein Objekt, aber die Klasse String beinhaltet so ein Array als Member-Variable. Und alle Klassen erben von der Super-Ober-Klasse "Object". Die zweite Definition ist nicht ganz richtig, denn Zeichenketten sind eigentlich keine Objekte sondern ein Array von einem primitiven Datentyp. Ok ich hab mich wiederholt, aber ich glaub du hast mich verstanden =)
-
Klassen sind "Blaupausen", von denen man Objekte erstellen kann. Zum
Beispiel kannst du von der Klasse String ein Object instanzieren.
Da man aber in der Regel sehr viel mit solchen Zeichenketten arbeitet,
gibt es in vielen Programmiersprachen eine spezielle Syntax, mit der
man Strings instanzieren kann.
ist also genau das selbe wie
was sich auch leicht nachpruefen laesst:Alles klar?
Uebrigens: Klassen sind meist selbst wieder nur Objekte, die von
anderen Klassen instanziert wurden. -
-
Zitat von Swoncen
häh? Du meinst wohl eine Instanz einer Klasse ist ein Objekt.
Ich meine das Klassen selbst wieder nur Instanzen von anderen Klassen
sind. Die Klasse java.lang.String ist zum Beispiel eine Instanz der
Klasse java.lang.Class :die in Java verwendete Art, Klassen zu definieren:
ist also selbst nur wieder eine besondere Syntax der Instanzierung,
damit es es der Programmierer leichter hat. Aehnlich wie das schon bei
"" und new String() der Fall war. -
-
Zitat von Paulchen
Da du ein 534-Student bist... hast du das dem Puntigam in OOP auch so erzählt (so du OOP schon gemacht hast)? Spricht man da nicht eher von Vererbung bzw. Untertypbeziehungen?
Ich habe OOP angerechnet bekommen. Ich mache aber gerade
Fortgeschrittene OOP beim Puntigam und bin ein Fan vom "Kaiser
Franz".In dem obenstehenden Code kommt tatsaechlich keine Vererbung, sondern
Instanzierung zum tragen:Die Klasse java.lang.String ist eine Subklasse der Klasse
java.lang.Object, aber eine Instanz der Klasse java.lang.Class!Zitat von Java API
Instances of the class Class represent classes and interfaces in a running Java application.-- http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html
Java ist leider nicht gerade ein Musterbeispiel fuer eine Objektorientierte Programmiersprache, weshalb diese Dinge oft nicht so offensichtlich sind wie sie es eigentlich sein sollten.
-
Zitat von Paulchen
Spricht man da nicht eher von Vererbung bzw. Untertypbeziehungen?
Wovon er spricht wird "Klassenobjekt" genannt. Jede Klasse an sich ist auch wieder ein Objekt. Mit dem Wort "static" definiert man in Java nichts anderes als eine Instanzmethode oder -variable des Klassenobjekts. Das ist einer der großen Unterschiede zwischen dynamischen Programmiersprachen wie Java, Smalltalk oder Objective C und statischen wie C++, welche soetwas nicht besitzen. Java versteckt das nur hinter C++-artigem Syntax, um es den Programmierern leichter zu machen.
Ein Klassenobjekt kann genauso verwendet werden wie jedes andere Objekt, nur gibts halt genau eines davon.
Dieses Konzept hat im übrigen zur Folge, dass es auch für Klassenobjekte normale Konstruktoren gibt, die automatisch beim Reinladen der Klasse in den RAM aufgerufen werden, was sehr praktisch ist, wenn man Dinge initialisieren muss, die für sämtliche Instanzen der Klasse wichtig sind (zB Bilder reinladen oder sowas).
-
Hab ich gar nicht gewusst. Ein weiterer Grund warum ich kein Java verwend..
-
-
Was heißt es kann mehr? Es macht die Arbeit für den Programmierer leichter, aber wo sind bitte die Pointer? Java ist ausserdem extrem langsam. Ich sag nicht, dass es für jeden schlecht ist, aber für die Dinge, die ich mache sind genau die Punkte wichtig. Wenn du's cool findest, dann wirst du schon deinen Grund haben, aber ich mags nicht =)
-
Zitat von Swoncen
Was heißt es kann mehr?
object introspection, class objects, RMI, sandbox...
Zitatwo sind bitte die Pointer?
Pointer sind schon aus rein sicherheitstechnischen Gründen nicht möglich (siehe Java-Applets, Java Webstart). Du darfst nicht Zugriff auf ein Objekt haben, das außerhalb deines Einflussbereichs steht.
ZitatJava ist ausserdem extrem langsam.
Wenn man ein Gerücht ständig wiederholt, wirds dadurch auch net wahrer...
Zitatfür die Dinge, die ich mache sind genau die Punkte wichtig.
Du hast nur einen genannt (Performance).
ZitatWenn du's cool findest, dann wirst du schon deinen Grund haben, aber ich mags nicht =)
Ich finds cool, weils eine der wenigen populären dynamischen OO-Programmiersprachen ist. Ich persönlich zieh eigentlich Objective C vor, aber das ist wohl vielen Programmierern zu wenig C++-artig.
-
Um so abstrakter die Programmiersprache, umso mehr kann sich der
Programmierer auf die Problemlösung konzentrieren.Um so maschinennäher die Programmiersprache, umso performanter kann
die Software laufen.In den meisten Anwendungen steht die Problemlösung stark im
Vordergrund. Daher gilt im Allgemeinen: Um so abstrakter die Sprache,
umso effizienter die Software.In den Fällen, in denen die gewünschte Performance mit der
abstrakten Sprache tatsächlich nicht erreicht werden kann, zahlt sich
OptimizeLater meist eher aus, als dass man gleich
das gesamte Projekt in einer low level Sprache umsetzt:Zitat von PortlandPatternRepository
Don't code for performance. Don't
use a "fast" language. Code for maintainability and use a language
that improves that maintainability. Then profile your code, find out
where the bottlenecks are, and replace only those bits with
performance-coded fast-language stuff. The result is that your code
will effectively run just as fast as if you'd optimized all of it, but
it'll be vastly more maintainable. -
-
@ hal: Du behauptest also, dass Java genauso performant ist wie C/C++? Das nehm ich mal an, sonst würdest du nicht sagen, dass es ein Gerücht ist. Aber allein, dass es eine Interpretersprache ist, isses schon langsamer. Warum sollte das ein Gerücht sein?
-
Zitat von Swoncen
@ hal: Du behauptest also, dass Java genauso performant ist wie C/C++?
Also das hat hal aber so nicht gesagt!
Ich lese:
Zitat von Swoncen
Java ist ausserdem extrem langsam.Zitat von hal
Wenn man ein Gerücht ständig wiederholt, wirds dadurch auch net wahrer...Von "genauso performant wie C++" hat er also nicht gesprochen. "Extrem
langsam" interpretiere ich als "Inakzeptabel langsam fuer moderne
Anwendungen", und das ist tatsaechlich ein Geruecht aus den 90er
Jahren.Zitat von Swoncen
Aber allein, dass es eine Interpretersprache ist, isses schon langsamer.Jede und keine Sprache wird interpretiert. C++ wird in den
Maschinencode der Maschine uebersetzt, Java wird in den Maschinencode
der (virtuellen) Maschine uebersetzt.Zudem wird dank JIT-Compilern ein Grossteil des Bytecodes mittlerweile
direkt in "tatsaechlichen" Maschinencode uebersetzt. -
Zitat von Swoncen
@ hal: Du behauptest also, dass Java genauso performant ist wie C/C++?
Grundsätzlich hab ich das wie schon bemerkt nicht behauptet, allerdings ist Java in pathetischen Spezialfällen tatsächlich schneller als C++ (enge Schleifen ohne I/O), weil der JIT-Compiler laufzeitdatenabhängig optimieren kann, was bei C++ nicht möglich ist.
-
Zitat von a9bejo
Java ist leider nicht gerade ein Musterbeispiel fuer eine Objektorientierte Programmiersprache, weshalb diese Dinge oft nicht so offensichtlich sind wie sie es eigentlich sein sollten.
Ach, das passt schon. Reflection ist halt eine eigene Sache. Dadurch, dass Klassen auch nur Instanzen einer "Metaklasse" sind, hat Java eine Idee von Smalltalk übernommen.Java ist sogar ein sehr gutes Beispiel für eine OO Sprache.
Leider hat es die Syntax und einige "dumme" Features von C++ übernommen (genauso wie C#), dafür andere sinnvolle nicht. Viele Möglichkeiten für große Verbesserungen wurden einfach übersehen (z.b. kann man ohne weiteres aus den primitiven Typen Klassen machen, ohne Performanceverlust; Eiffel zeigt, wie's geht). Generizität hätte auch vom Anfang an drin sein sollen. Leider ist es unsauber und typunsicher implementiert, damit man die JVM nicht updaten musste.
Aber schon allein Garbage Collection ist eine sehr wichtige Neuerung gegenüber C++. Im Allgemeinen ist der Performanceverlust dadurch nur 10% gegenüber manueller Speicherverwaltung. Das ist locker verschmerzbar, weil man dadurch viele Bugs einfach nicht einbauen kann.
Schade, dass (trotz allen Gegenbekundungen) Java immer noch für Programme mit User Interfaces saulangsam ist und Swing so eine Krücke (in jeder Hinsicht) ist. Beides merkt man sofort, sobald man ein Java Programm vor sich hat. Ersteres sogar schon beim Starten
-
-
Zitat
Du behauptest also, dass Java genauso performant ist wie C/C++? Das nehm ich mal an, sonst würdest du nicht sagen, dass es ein Gerücht ist. Aber allein, dass es eine Interpretersprache ist, isses schon langsamer. Warum sollte das ein Gerücht sein?Tja, definert mal was es bedeutet, eine Sprache X sei performanter als eine Sprache Y.
Eine Dimension dieser Schwachsinnigkeit ist, daß Sprachen keine Performance haben können.
Höchstens konkrete Compiler/Interpreter dieser Sprachen.C++ sei also performanter als Java ?
Welcher C++ Compiler mit welchen Optimierungen/Einstellungen ?
Welche JVM mit welchen Einstellungen ?Selbst wenn das fixiert ist, kann ich problemlos einen derart miesen C++ Compiler schreiben, der garantiert schlechter als jede jemals exisitierende JVM ist.
Daraus folgt -> Java ist performanter als C++ !?
Der umgekehrte Fall kann genauso konstruiert werden, also
gilt beides ?! Häh ?Gut, wenn das geklärt ist: Wie sieht's denn aus, wenn Programm A performanter in Sprache X ist, aber Programm B performanter in Y ? Ist dann X performanter oder Y ?
Oder vielleicht umgekehrt ?
Warum A und B und nicht C ?
Zählt man alle möglichen Programme ?
Wenn geklärt ist, wie man das macht, bleibt noch die Killerfrage: bildet man das arithmetische Mittel oder gar das Geometrische ?
Die höchste Ebene dieser Schwachsinnigkeit kommt aber erst: Es ist völlig irrelevant
(Ok, nicht in allen Fällen, schon klar, aber viel öfter als
man denkt)Selbst wenn man - wie auch immer - zum Ergebnis kommt Sprache X sei performanter als Y.
Stichwort Optimize-later bzw ganz allgemein -> Design Patterns "weise" verweden -> sprachunabhängig extrem wichtig ...
Überlebenswichtig für einen guten Software-Engineer würd ich mal sagen aus eigener leidvoller Erfahrung.
Ebenso auf dieser Liga -> Algorithmen-Design, das ist noch völlig sprachunabhänig ..Weniger Abstrakt: Man nehme einen schlechten Programmierer, der eine Aufgabe in einer "schnellen" Sprache lösen soll, und einen Guten, der die selbe Aufgabe in einer "langsamen" Programmiersprache lösen soll.
Frageeeeee: Wird das Programm in der schnellen Programmiersprache schneller/besser als das in der Langsamen ?
----------------------------------------Nimmt man einigermassen moderne C++ Compiler und JVMs, so ist der Performacegap weitaus geringer als meist angenommen.
edit:
ganz nett, auch wenn memory-usage vergleich imho krass sinnlos ist ...
End of Blablababla ...
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!