1

我正在尝试使用 getter/setter 在子类中设置颜色,但存在编译错误。

//world.java
import java.awt.Color;

public class world {
    private Color color;

    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
}

//object.java
public class object extends world {
    public object{
        setColor(new world.Color(255,0,0); //compile error
    }
}

java.awt.Color我可以通过在 child 中导入并键入来轻松解决这个问题setColor(new Color(255,0,0),但是当它已经在 parent 中导入时不是多余的吗?我还尝试了其他语法,例如setColor(world.setColor(new Color(255,0,0)))但这会产生不同的错误。正确执行此操作的正确语法是什么?

4

4 回答 4

1

在某些方面使用new world.Color(255,0,0);是不正确的。对于 Java 编译器,您为名为 world 的类请求一个名为 Color 的内部静态类。如果将其添加到代码库中,它不会导致编译错误:

//world.java (different to World.java)
class world {
    public static class Color {
         public Color(int r, int g, int b) {}
    }
}

因此,您可以使用new Color(255, 0, 0);.

而且导入语句也不是冗余。在 Java 中,每个 java 文件都定义了一个编译单元。这个单位代表自己。您按类型引用的每个类(直接命名的类/接口)必须仅通过知道包名、类名及其定义(内部类/接口、匿名类等)即可解析。由于 Color 来自一个遥远的包,因此编译单元(您的 java 文件)必须包含对 Color 类的引用。这可以通过使用 import 语句或通过其全名(= package + "." + class-name)引用 Color 类来完成,这意味着 java.awt.Color。

于 2013-10-02T22:55:38.297 回答
0

简直了

   setColor(new Color(255,0,0); //no compile error

(您必须import在使用类的每个文件中都有该语句......)

解释:

手头的类扩展world- 这意味着 setColor() 方法“就在那里”而无需再次声明。它将正确设置类的color即时字段world,而无需明确指定...带有静态修饰符的方法和字段始终与本身相关,而不是与类的实例相关

为什么setColor(world.setColor(new Color(255,0,0)))不工作?

此语法用于访问类的静态方法world- 但这样的方法不存在。您所拥有的是一个非静态方法,这在这种情况下是完全合适的,因为颜色值与类的每个实例单独相关。所以在这种情况下,world.setColor() 语法无效。

根据 OP 评论,GameObject 已换成世界

需要遵守的一些规则

  • 类名以大写开头
  • 不要使用与 JDK 库类相似或完全相同的名称。尤其适用于 Object、String 等!!!
于 2013-10-02T22:52:17.403 回答
0

不, animport并不是多余的,因为它是在包含超类的文件中指定的。的import范围是它所在的源文件。位于不同源文件中的子类(或任何其他类)需要自己的导入。

您可以import java.awt.Color;再次在子类源文件中,并Color通过其简单名称进行引用。

setColor(new Color(255, 0, 0));

或者,您可以在需要时提供完全合格的参考:

setColor(new java.awt.Color(255, 0, 0));

JLS,第 6.3 节对导入的范围有这样的说法:

通过单一类型导入声明(第 7.5.1 节)或按需类型导入声明(第 7.5.2 节)导入的类型的范围是所有类和接口类型声明(第 7.6 节)出现导入声明的编译单元,以及编译单元的包声明(如果有)上的任何注释。

“编译单元”是指源代码文件。

于 2013-10-02T22:53:58.963 回答
0

这里的问题是 Color 类不是世界的成员,因此new world.Color(255,0,0)无效。在这一点上,你只能说new Color(255,0,0)

也就是说,即使您的world类正在导入Color,它也没有定义Color

于 2013-10-02T22:54:17.143 回答