In C ++ bedeutet das Markieren einer Mitgliedsfunktion, const
dass sie für const
Instanzen aufgerufen werden kann. Java hat kein Äquivalent dazu. Z.B:
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
Werte können später in Java nur einmal zugewiesen werden, z.
public class Foo {
void bar() {
final int a;
a = 10;
}
}
ist in Java legal, aber nicht in C ++, wohingegen:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, even in Java: a has already been assigned a value.
}
}
Sowohl in Java als auch in C ++ können Mitgliedsvariablen final
/ sein const
. Diese müssen einen Wert erhalten, wenn eine Instanz der Klasse fertig erstellt ist.
In Java müssen sie festgelegt werden, bevor der Konstruktor fertig ist. Dies kann auf zwei Arten erreicht werden:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
In C ++ müssen Sie Initialisierungslisten verwenden, um const
Mitgliedern einen Wert zu geben :
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
In Java kann final verwendet werden, um Dinge als nicht überschreibbar zu markieren. C ++ (vor C ++ 11) tut dies nicht. Z.B:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Aber in C ++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
Dies ist in Ordnung, da die Semantik des Markierens einer Elementfunktion const
unterschiedlich ist. (Sie können auch überladen, indem Sie nur const
eine der Elementfunktionen verwenden. (Beachten Sie auch, dass in C ++ 11 Elementfunktionen als endgültig markiert werden können, siehe Abschnitt zum Aktualisieren von C ++ 11).
C ++ 11 Update:
In C ++ 11 können Sie tatsächlich sowohl Klassen als auch final
Elementfunktionen mit identischer Semantik für dasselbe Feature in Java markieren , z. B. in Java:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Kann jetzt in C ++ 11 genau wie folgt geschrieben werden:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
Ich musste dieses Beispiel mit einer Vorabversion von G ++ 4.7 kompilieren. Beachten Sie, dass dies const
in diesem Fall nicht ersetzt , sondern erweitert wird, indem das Java-ähnliche Verhalten bereitgestellt wird, das mit dem nächstgelegenen entsprechenden C ++ - Schlüsselwort nicht angezeigt wurde. Also , wenn Sie wollten beide eine Member - Funktion sein final
und const
Sie tun würden:
class Bar {
public:
virtual void foo() const final;
};
(Die Reihenfolge von const
und final
hier ist erforderlich).
Bisher gab es kein direktes Äquivalent zu const
Mitgliedsfunktionen, obwohl virtual
es eine potenzielle Option wäre , Funktionen nicht zu machen, ohne jedoch beim Kompilieren einen Fehler zu verursachen.
Ebenso das Java:
public final class Bar {
}
public class Error extends Bar {
}
wird in C ++ 11:
class Bar final {
};
class Error : public Bar {
};
(Bisher waren private
Konstruktoren wahrscheinlich die nächsten, die Sie in C ++ erreichen konnten.)
Interessanterweise ist zur Aufrechterhaltung der Abwärtskompatibilität mit Code vor C ++ 11 final
kein Schlüsselwort in der üblichen Weise. (Nehmen Sie das triviale, legale C ++ 98-Beispiel, um struct final;
zu sehen, warum das Erstellen eines Schlüsselworts den Code beschädigen würde.)
final int a; a = 10; a = 11;
dass dies nicht derfinal
Fall ist (dies ist der Zweck eines Variablenmodifikators). Außerdem können endgültige Mitglieder einer Klasse nur zur Deklarationszeit oder einmal in einem Konstruktor festgelegt werden .final
genau für diesen Zweck hinzufügt . VC ++ 2005, 2008 und 2010 haben dies bereits implementiert, wobei das kontextbezogene Schlüsselwortsealed
anstelle von verwendet wirdfinal
.In Java kann das letzte Schlüsselwort für vier Dinge verwendet werden:
Eine wichtige Sache ist: Eine Java-Final-Member-Variable muss genau einmal gesetzt werden! Zum Beispiel in einem Konstruktor, einer Felddeklaration oder einem Intializer. (Sie können jedoch keine endgültige Elementvariable in einer Methode festlegen.)
Eine weitere Konsequenz der endgültigen Festlegung einer Mitgliedsvariablen betrifft das Speichermodell. Dies ist wichtig, wenn Sie in einer Thread-Umgebung arbeiten.
quelle
Ein
const
Objekt kann nurconst
Methoden aufrufen und wird im Allgemeinen als unveränderlich angesehen.Ein
final
Objekt kann nicht auf ein neues Objekt gesetzt werden, aber es ist nicht unveränderlich - nichts hindert jemanden daran,set
Methoden aufzurufen .Java hat keine inhärente Möglichkeit, Objekte für unveränderlich zu erklären. Sie müssen die Klasse selbst als unveränderlich gestalten.
Wenn die Variable ein primitiver Typ ist,
final
/const
die gleiche Arbeit.quelle
Java final entspricht C ++ const für primitive Werttypen.
Bei Java-Referenztypen entspricht das endgültige Schlüsselwort einem const-Zeiger ... dh
quelle
Sie haben hier bereits einige gute Antworten, aber ein Punkt, der es wert schien, hinzugefügt zu werden:
const
In C ++ wird häufig verwendet, um zu verhindern, dass andere Teile des Programms den Status von Objekten ändern. Wie bereits erwähnt,final
kann dies in Java nicht möglich sein (außer bei Grundelementen). Es verhindert lediglich, dass die Referenz in ein anderes Objekt geändert wird. Wenn Sie jedoch a verwendenCollection
, können Sie Änderungen an Ihren Objekten mithilfe der statischen Methode verhindernDies gibt eine
Collection
Referenz zurück, die Lesezugriff auf die Elemente gewährt, aber eine Ausnahme auslöst, wenn Änderungen versucht werden, was sie ein bisschen wieconst
in C ++ machtquelle
Java
final
funktioniert nur mit primitiven Typen und Referenzen, niemals mit Objektinstanzen selbst, in denen das Schlüsselwort const für irgendetwas funktioniert.Der Vergleich
const list<int> melist;
mitfinal List<Integer> melist;
der ersten macht es unmöglich, die Liste zu ändern, während die letztere Sie nur daran hindert, eine neue Liste zuzuweisenmelist
.quelle
Abgesehen von bestimmten und subtilen Multithreading-Eigenschaften müssen deklarierte Variablen bei der Deklaration
final
nicht initialisiert werden!dh Dies ist gültig in Java:
Dies wäre nicht gültig, wenn mit C ++ geschrieben
const
.quelle
Laut Wikipedia :
quelle
Ich vermute, es heißt "grob", weil die Bedeutung von
const
in C ++ kompliziert wird, wenn Sie über Zeiger sprechen, dh konstante Zeiger vs. Zeiger auf konstante Objekte. Da es in Java keine "expliziten" Zeiger gibt, tretenfinal
diese Probleme nicht auf.quelle
Lassen Sie mich anhand eines Beispiels für eine switch / case-Anweisung erklären, was ich verstanden habe.
Die Werte in jeder case-Anweisung müssen Konstantenwerte zur Kompilierungszeit desselben Datentyps wie der Schaltwert sein.
Deklarieren Sie etwas wie das Folgende (entweder in Ihrer Methode als lokale Instanzen oder in Ihrer Klasse als statische Variable (fügen Sie dann statische hinzu) oder eine Instanzvariable.
und
Dieser Code wird nicht kompiliert, wenn
color1
es sich um eine Klassen- / Instanzvariable und nicht um eine lokale Variable handelt. Dies wird kompiliert, wenncolor1
es als statische endgültige Variable definiert ist (dann wird es zur statischen endgültigen Variablen).Wenn es nicht kompiliert wird, wird der folgende Fehler angezeigt
quelle
Das Schlüsselwort "const" bedeutet, dass Ihre Variable im ROM gespeichert ist (mit Mikroprozessor). Im Computer wird Ihre Variable im RAM-Bereich für Assembly-Code gespeichert (schreibgeschützter RAM). Dies bedeutet, dass sich Ihre Variable nicht im beschreibbaren RAM befindet. Dazu gehören: statischer Speicher, Stapelspeicher und Heapspeicher.
Das Schlüsselwort "final" bedeutet, dass Ihre Variable im beschreibbaren RAM gespeichert ist. Sie werden jedoch vom Compiler darauf hingewiesen, dass Ihre Variable nur einmal geändert wird.
Ich denke, "const" hat eine schlechte Leistung, daher verwendet Java es nicht.
quelle