gewusst wie: überschreiben einer abstrakten Methode in einer Unterklasse?
Habe ich zum erstellen von Unterklassen einer abstrakten Oberklasse, die drucken Sie Formen, jedoch immer wenn ich versuche ein Objekt zu erschaffen, es sagt mir, dass ich kann nicht instanziiert werden eine abstrakte Klasse ist, und wenn ich entfernen Sie das Schlüsselwort abstract
aus meinem code, überschreibt er sagt, ich kann nicht tun, dass entweder.
Mein code:
public class Rectangle extends VectorObject {
protected int ID, x, y, xlnth, ylnth;
protected int matrix[][];
Rectangle(int id, int ax, int ay, int xlen, int ylen) {
super(id, ax, ay);
xlnth = xlen;
ylnth = ylen;
}
public int getId() {
return ID;
}
public void draw() {
String [][] matrix = new String[20][20];
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
if (i == x) {
matrix[i][y] = "*";
}
if (j==y) {
matrix[i][y] = "*";
}
System.out.println(matrix[i][y]);
}
}
}
}
Abstrakten Eltern-Klasse:
abstract class VectorObject {
protected int id, x, y;
VectorObject(int anId, int ax, int ay) {
id = anId;
x = ax;
y = ay;
}
int getId() {
return id;
}
void setNewCoords(int newx, int newy) {
x = newx;
y = newy;
}
public abstract void draw (char [][] matrix);
}
- Mach dir nicht zu viele sorgen über Fehler zu machen jetzt. Nur lernen, und zahlen Ihre Aufmerksamkeit!
- Ihr Titel und die Fehlermeldung, die Sie erwähnen, sind nicht miteinander verwandt. Bitte klären Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei der Definition einer abstrakten Methode in einer Klasse, sagen Sie, dass die Unterklassen des Objekts MUSS umzusetzen, es sei denn, Sie sind eine abstrakte Klasse. Also, wenn Sie den ausbau der
VectorObject
mit derRectange
- Klasse, müssen Sie implementieren einedraw
- Methode mit den gleichen Parametern.Blick auf die Kopfzeile der Funktion, die Sie in
VectorObject
:public abstract void draw ( char [][] matrix );
Betrachten wir nun den header der Funktion in
Rectange
:public void draw()
Diese sind nicht die gleichen, so ist es nicht als ein "Überschreiben" und es ist ein Fehler, weil Sie noch nicht implementiert die Methode
draw( char[][] matrix )
Den richtigen Weg zu Ihrer Umsetzung in
Rectange
wäre:Wenn wir die
@Override
Anmerkung, wir sagen dem compiler, dass wir überschreiben einer übergeordneten Klassen-Methode. Sie sollte immer verwenden Sie diesen Kommentar, wenn die Umsetzung einer übergeordneten Klasse die Methode, wie es wird Sie wissen lassen, wenn Sie irgendwie versaut die Unterschrift, und es ist einfacher zu verstehen, von anderen Entwicklern.Um überschreiben eine Methode, müssen für Sie die passenden Signaturen.
Den abstrakten übergeordneten Methode hat
char[][] matrix
; in der Erwägung, dass die Kind-Methode übernimmt keine Argumente. Damit sind Sie nicht überschreiben.In anderen Worten: überschreiben ist mehr als nur mit zwei Methoden mit dem gleichen Namen!
Die einfache Sache, dass Sie sollten immer tun: legen Sie die @Override-annotation jede Methode, die Sie denken: ich bin überwiegendes hier etwas.
Wenn Sie wissen, dass der compiler Ihnen sofort sagen wird, dass die Rechteck-version von draw() nicht überschreiben alles!
Signatur der Methode ist nicht das gleiche. Die Parameter der Mutter-und Kind unterschiedlich sind.
Versuchen Sie, die @Override annotation Kind-Klasse Methode und es wird Ihnen zeigen, die Probleme
@Override-annotation sicherzustellen, dass alle obligatorischen Durchführung überschreiben einer Methode eingehalten werden. Die Methode annotiert werden, würden überprüft, gegen die übergeordnete Methode. Wenn es keine Methode mit der passenden Signatur, es wird sich zeigen Kompilierungsfehler.
In Ihrem Fall die übergeordnete abstrakte Klasse und Methode, die Sie überschreiben müssen, ist
public abstract void zeichne (char [][] matrix)
in der Erwägung, dass die Kind-Klasse Signatur der Methode ist
public void zeichnen()
so die Argumente mismatch
@Override
. Es wird hilfreich sein.