为什么我必须在我的子类中使用导入,当它已经在超类中时?

时间:2015-06-04 18:05:48

标签: java abstract-class

我有两个问题。

我有一个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;
  }
}

2 个答案:

答案 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;
    }
 }