3

このエラーが発生し、混乱しています。修正方法がわかりません。他にもエラーがあることは知っていますが、今のところあまり心配していません。

コードは次のとおりです。

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() + ")";

}}

クラスファイルは次のとおりです。

// 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();
}
}

そして、ここにテストファイルがあります:

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()); 


}
}

エラーは次のとおりです。

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
4

4 に答える 4

6

user1490835 さんの診断には同意しますが、よくわからない場合に備えて、このエラーで何が起こっているのかを説明するとよいと思います。

抽象メソッドは、すべての子クラス (抽象メソッドでクラスを拡張するクラス) がそのメソッドを実行できるというコンパイラへの約束です。その約束を果たすには、子クラスがまったく同じヘッダーを使用して抽象メソッドを実装する必要があります。したがって、Java ランタイムでは、任意の子クラスのインスタンスで抽象メソッドを呼び出すことができ、正しいパラメーターなどを使用したことがわかります。

なんで?サブクラスがそのメソッドにわずかに異なるヘッダーを使用した場合 (回避しようとしている実行時エラーが発生するため)、コードはコンパイルされないためです (取得しているエラーが発生する可能性があります)。


たとえばA、抽象メソッドf()と 2 つの具象サブクラスBおよびを持つ抽象クラスを想像してみてくださいC。プログラムのどこかに次のものがあります。

    A avar;
    if (somevar < othervar) {
        avar = new B();
    } else {
        avar = new C();
    }
    avar.f();

if ステートメントの結果に依存するため、実行時にaまたは aにavarなるかどうかはわかりません。しかし、それが のサブクラスになることはわかっています。のすべてのサブクラスは正しいヘッダーで実装されている必要があるため (そうしないと、プログラマーがコンパイル エラーを受け取る可能性があります)、このコードが実行中に壊れることはありません。BCavarAAf


コードでは、抽象メソッド ヘッダーとその実装の違いは次のとおりです。

public abstract void scale(); // no parameter
public void scale(double scaleFactor) { // one parameter

これを修正するには、抽象メソッドに double パラメーターを追加します。

于 2012-10-11T03:05:22.413 に答える
1

私が見つけた最初の問題は、パラメーターなしで Scale 抽象メソッドを宣言したが、抽象クラスを拡張するときに、パラメーターを使用して Scale メソッドを実装していることです。そのため、すべてのサブクラスでこのエラーがスローされます。

Circle は抽象的ではなく、Shape の抽象メソッド scale() をオーバーライドしません

また、次のエラーが発生します。

./Shape.java:46: ';' expected

return "Position: (" + getX() + ", " + getY() + ") Color: (" + 
getRed() + getBlue() + ", " getGreen() + ")";

getGreen 関数の前に + 記号を追加するのを忘れており、Java はそれを行末として想定しているため、エラー ';' が発生します。

getRed シンボル エラーは、getRed という関数がないためですか? 等々!

于 2012-10-11T02:10:35.760 に答える
0

うーん、そう言う理由は、クラス「Shape」から継承しているからです。そのクラスはメソッド scale() を定義します。

したがって、メソッド scale() を「Circle」と「Rectangle」に実装するか、それらを asbtract として定義します。scale() メソッドを実装するだけで、それらを抽象化しないことをお勧めします。それがあなたが意図していることだと思うからです。

于 2012-10-11T02:14:10.780 に答える
0

Java でクラスを使用する前に、まずそのクラスをインポートする必要があります。

ShapeTest.java に以下を追加する必要があります。

import Circle;
import Rectangle;
import java.awt.Color;

Circle.java と Rectangle.java に以下を追加する必要があります。

import Shape;

さらに、ファイルがパッケージ内にあることも確認する必要があります。http://en.wikipedia.org/wiki/Java_packageを参照

于 2012-10-11T02:11:37.493 に答える