“n'est pas abstrait et ne remplace pas la méthode abstraite” erreur
J'obtiens cette erreur et il est source de confusion pour moi. Je ne sais pas comment le résoudre. Je sais qu'il y a quelques autres erreurs là, mais je ne suis pas trop inquiet à propos de ceux qui pour l'instant.
Voici le code:
import java.awt.*;
public abstract class Shape {
//Instance variables
private int x;
private int y;
private Color color;
//Constructor
protected Shape(int x, int y, Color color) {
this.x = x;
this.y = y;
this.color = color;
}
//Abstract methods
public abstract void draw(Graphics g);
public abstract int getHeight();
public abstract int getWidth();
public abstract void scale();
public abstract double area();
//Other instance methods
public Color getColor() {
return color;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void move(int dx, int dy) {
x += dx;
y += dy;
}
public void setColor(Color color) {
this.color = color;
}
public String toString() {
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + getBlue() + ", " getGreen() + ")";
}
}
Voici les fichiers de classe:
//Represents a circle that can be displayed in a graphics
//context
import java.awt.*;
public class Circle extends Shape {
//Instance variables
private int diameter;
private double scaleFactor = 2;
private double area;
//Constructor
public Circle(int x, int y, Color color, int diameter) {
super(x, y, color);
this.diameter = diameter;
}
//Instance methods
public void draw(Graphics g) {
g.setColor(getColor());
g.fillOval(getX(), getY(), diameter, diameter);
}
public int getHeight() {
return diameter;
}
public int getWidth() {
return diameter;
}
public void scale(double scaleFactor) {
(double) diameter *= scaleFactor;
}
public double area() {
area = (3.14 * (diameter * diameter)) / 4;
return area;
}
public String toString() {
return "Diameter: " + diameter + "\nWidth: " + getWidth() + "Height: " + getHeight();
}
}
import java.awt.*;
public class Rectangle extends Shape {
//Instance variables
private int width;
private int height;
private double scaleFactor = 2;
private double diameter = width * height;
private double area;
//Constructor
public Rectangle(int x, int y, Color color,
int width, int height) {
super(x, y, color);
this.width = width;
this.height = height;
}
//Instance methods
public void draw(Graphics g) {
g.setColor(getColor());
g.fillRect(getX(), getY(), width, height);
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public void scale(double scaleFactor){
width *= scaleFactor;
height *= scaleFactor;
}
public double area() {
area = (3.14 * (diameter * diameter)) / 4;
return area;
}
public String toString() {
return "Diameter: " + diameter + "\nWidth: " + getWidth() + "Height: " +
getHeight();
}
}
Et voici le fichier de test:
public class ShapeTest
{
public static void main(String[] args)
{
Color myC = new Color(10, 30, 20);
Circle myCircle = new Circle(0, 0, myC, 5);
Rectangle myRectangle = new Rectangle(0, 0, myC, 2, 3);
System.out.println(myCircle.toString());
System.out.println(myRectangle.toString());
}
}
Voici les erreurs:
javac ShapeTest.java
ShapeTest.java:5: cannot find symbol
symbol : class Color
location: class ShapeTest
Color myC = new Color(10, 30, 20);
^
ShapeTest.java:5: cannot find symbol
symbol : class Color
location: class ShapeTest
Color myC = new Color(10, 30, 20);
^
./Shape.java:46: ';' expected
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + getBlue() + ", " getGreen() + ")";
^
./Shape.java:46: not a statement
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + g etBlue() + ", " getGreen() + ")";
^
./Shape.java:46: cannot find symbol
symbol : method getRed()
location: class Shape
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + getBlue() + ", " getGreen() + ")";
^
./Shape.java:46: cannot find symbol
symbol : method getBlue()
location: class Shape
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + getBlue() + ", " getGreen() + ")";
^
./Shape.java:46: cannot find symbol
symbol : method getGreen()
location: class Shape
return "Position: (" + getX() + ", " + getY() + ") Color: (" + getRed() + ", " + getBlue() + ", " getGreen() + ")";
^
./Circle.java:16: Circle is not abstract and does not override abstract method scale() in Shape
public class Circle extends Shape {
^
./Circle.java:43: unexpected type
required: variable
found : value
(double) diameter *= scaleFactor;
^
./Rectangle.java:3: Rectangle is not abstract and does not override abstract method scale() in Shape
public class Rectangle extends Shape {
^
10 errors
Vous avez besoin d'importer votre
Sûrement pas tous du même code est pertinent à votre problème.
Vous êtes également en manque un + sur la ligne 46 de Shape.java.
Color
, Circle
et Rectangle
classes dans votre ShapeTest
classe.Sûrement pas tous du même code est pertinent à votre problème.
Vous êtes également en manque un + sur la ligne 46 de Shape.java.
OriginalL'auteur TheNameHobbs | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord avec user1490835 du diagnostic, mais j'ai pensé qu'il pourrait être bon d'expliquer ce qu'il se passe avec cette erreur, juste au cas où vous n'êtes pas sûr.
Une méthode abstraite est une promesse pour le compilateur que tous les enfants des classes (ceux que l'extension de la classe avec la méthode abstraite) sera en mesure de faire que de la méthode. Le cadre de l'accomplissement de cette promesse, c'est que l'enfant classes doivent implémenter la méthode abstraite à l'aide de la exactement le même en-tête. Ainsi, dans le Java runtime, vous pouvez appeler la méthode abstraite sur une instance de tout de l'enfant des classes et de savoir que vous aurez utilisé les paramètres corrects et ainsi de suite.
Pourquoi? Parce que si la sous-classe utilisée est légèrement différent de l'en-tête de cette méthode (qui provoquent l'erreur d'exécution, nous essayons d'éviter), le code n'aurait pas compilé (il aurait donné l'erreur vous êtes arriver).
Par exemple, imaginez une classe abstraite
A
qui a une méthode abstraitef()
et deux sous-classes concrètesB
etC
. Quelque part dans le programme, nous avons:Nous ne savons pas si
avar
sera unB
ou unC
au moment de l'exécution, parce qu'il dépend du résultat de l'instruction if. Mais nous savons queavar
sera une sous-classe deA
. Depuis toutes les classes deA
doivent avoir mis en œuvref
avec le bon en-tête (sinon, le programmeur aurait obtenu l'erreur de compilation que vous obtenez), nous savons ce code ne cassera pas en cours d'exécution!Dans votre code, la différence entre l'abstrait en-tête de méthode et de sa mise en œuvre est:
Pour le corriger, ajouter le double paramètre à la méthode abstraite.
OriginalL'auteur chm
La première question que j'ai pu trouver est que vous avez déclaré une Échelle abstraite méthode sans paramètres, mais quand vous êtes étendre la classe abstraite, vous êtes à la mise en œuvre de l'Échelle de la méthode avec des paramètres. C'est pourquoi cette erreur est levée dans tous les sous classes:
Cercle n'est pas abstrait et ne remplace pas la méthode abstraite scale() en Forme
Aussi avec l'erreur suivante:
Vous avez oublié d'ajouter le signe + devant getGreen la fonction et la Java s'attend à ce que la fin de la ligne, de sorte que c'est pourquoi le message d'erreur ';'
la getRed symbole d'erreur est parce que vous ne disposez pas d'une fonction appelée getRed? et ainsi de suite!
OriginalL'auteur Baahubali
Avant de pouvoir utiliser une classe en Java, vous devez d'abord importer la classe.
Dans ShapeTest.java vous devez ajouter:
Dans Circle.java et Rectangle.java vous devez ajouter:
En outre, vous devez également vous assurer que vos fichiers sont dans un package. Voir http://en.wikipedia.org/wiki/Java_package
OriginalL'auteur Nathan Villaescusa
Hmm, donc, la raison qu'il en dit est, que vous hérite de la classe "Forme". Cette classe définit la méthode scale().
Donc, soit vous mettre en place la méthode scale() dans "le Cercle" et "Rectangle" ou vous les définissez comme asbtract. Je propose que vous venez de mettre en œuvre la méthode scale() et ne les faites pas de résumé car je pense que c'est ce que vous comptez faire.
OriginalL'auteur Decrayer