我有两个问题。
我有一个Apple类,它扩展了一个抽象的Fruit类,见下面的代码↓
第一个问题:为什么我必须在我的苹果课中使用import java.awt.Color;
,因为它已经在我的Fruit课程中了?我收到一个错误:找不到符号
第二个问题:在我的苹果构造函数中,我有 String result = seasonal ? "yes" : "no";
(我希望布尔打印"是"或者"否")是正确的,它会更好吗? Fruit布尔方法或public static void main?如果是,我该怎么做?
Apple.java
import food.Fruit;
import java.awt.Color;
class Apple extends Fruit {
public static void main(String args[]) {
Fruit apple = new Apple(Color.RED, true);
apple.prepare();
System.out.println("Color: " + apple.getColor());
}
public Apple(Color color, boolean seasonal) {
super(color, seasonal);
String result = seasonal ? "yes" : "no";
System.out.println("Seasonal: " + result);
}
@Override
public void prepare() {
System.out.println("Cut the Apple");
}
}
Fruit.java
package food;
import java.awt.Color;
public abstract class Fruit {
private Color color;
private boolean seasonal;
public Fruit(Color color, boolean seasonal) {
this.color = color;
this.seasonal = seasonal;
}
public abstract void prepare();
public Color getColor() {
return color;
}
public boolean isSeasonal() {
return seasonal;
}
}
答案 0 :(得分:4)
第一个问题: 进口不会继承。仅仅因为你扩展了一个类,导入的东西不会导入该类的导入。简而言之:您需要在.java文件中导入所需的所有内容。
第二个问题: 只要有可能并且明智,就要将代码从子类移到父类。这减少了代码重复。
答案 1 :(得分:3)
第一个问题:为什么我必须使用import java.awt.Color;在我的苹果课上,因为它已经在我的水果班了?
因为它不在你的Fruit课程中。它位于编译单元 - 源文件中 - 包含您的Fruit类。导入适用于包含它的一个源文件中的所有代码。
导入不会被继承,因为源文件不具有继承权。
从Java语言规范section 7.5: Import declarations:
导入声明使类型或成员可用 仅通过编译单元中的简单名称 实际上包含导入声明。
问题2 ......
第二个问题:在我的apple构造函数中,我有String result = seasonal? "是" :"没有&#34 ;; (我希望boolean打印"是"或者" No")是正确的,它会在Fruit布尔方法或public static void main中更好吗?如果是,我该怎么做?
你有这两行:
String result = seasonal ? "yes" : "no";
System.out.println("Seasonal: " + result);
第二行最好放在 Fruit.isSeasonal()
或Apple()
构造函数中。在这些函数中,打印将是副作用,某些调用者可能不希望这样做。
在Apple.main()
中包含此代码是合理的。
另一种可能性是定义toString()
或类似的方法来构建描述,然后在任何地方打印描述。
public abstract class Fruit
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append( "Color: " + color.toString() );
String result = seasonal ? "yes" : "no";
builder.append("\nSeasonal: " + result);
return builder.toString();
}
}
这允许您扩展子类中的描述:
class Apple extends Fruit {
private AppleVariety appleVariety;
@Override
public String toString() {
String description = super.toString();
description += "\nApple variety: " + appleVariety;
return description;
}
}