我正在尝试使用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)))
,但这会产生不同的错误。正确执行此操作的正确语法是什么?
答案 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()语法无效。
GameObject交换世界
要采取的一些规则
答案 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
。