Java:如何在子类中设置颜色?

时间:2013-10-02 22:51:36

标签: java colors extends

我正在尝试使用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并键入setColor(new Color(255,0,0)来轻松解决此问题,但是当它已经导入父项时,它不是多余的吗?我还尝试了其他语法,例如setColor(world.setColor(new Color(255,0,0))),但这会产生不同的错误。正确执行此操作的正确语法是什么?

4 个答案:

答案 0 :(得分: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);来解决此问题。

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

答案 1 :(得分:0)

只是简单地

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

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

说明:

手头的类扩展world - 这意味着setColor()方法“就在那里”而不再声明它。它将恰当地设置color类的world instanct字段,而不明确指定...具有static修饰符的方法和字段始终与本身相关,而不是

实例

为什么setColor(world.setColor(new Color(255,0,0)))无效?

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

根据OPs评论

GameObject交换世界

要采取的一些规则

  • 班级名称以首都开头
  • 不要使用与JDK库类相似或完全相同的名称。 对于Object,String等尤其如此!!!

答案 2 :(得分:0)

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

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

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

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

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

JLS, Section 6.3可以说明导入的范围:

  

单一类型导入声明导入的类型的范围   (§7.5.1)或类型 - 按需进口声明(§7.5.2)就是全部   编译单元中的类和接口类型声明(第7.6节)   导入声明出现在其中,以及任何注释   编译单元的包声明(如果有的话)。

“编译单元”表示源代码文件。

答案 3 :(得分:0)

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

也就是说,即使您的world班级正在导入Color,也不会定义Color