【问题标题】:Problem with abstract methods using inheritance [duplicate]使用继承的抽象方法的问题[重复]
【发布时间】:2022-01-07 18:15:48
【问题描述】:

我正在学习Java中的继承,我正在尝试解决以下代码中的错误:

public static void main(String[] args) {
    Yellow yellow=new Yellow("yellow");
    yellow.ChangeColor();
}
abstract class SpecialColor{
    String color;
    
    SpecialColor(String color){
        this.color=color;
    }

    abstract void ChangeColor();
    
    public String ShowColor(String color) {
        return color;
    }
    
}

class Yellow extends SpecialColor{

    Yellow(String color) {
        super(color);
        
    }
    
    @Override
    void ChangeColor() {
        color="yellow";
        System.out.println("The color is "+color);
    }
    
}

我正在尝试做的任务基本上是说我需要创建一个具有 2 个属性的抽象类 SpecialColor - 颜色名称(字符串)和两个方法 - 抽象 void ChangeColor(),另一个显示颜色名称,而类Yellow 扩展了这个类并实现了抽象方法,名称需要改为“yellow”,并在 main.js 中显示这些类的使用。我遇到的错误出现在 main 方法的第一行代码中 - “没有可访问的封闭类型实例”,我试图解决这个问题,使 Yellow 类成为静态,但随后在 super(color) 行上弹出一个新错误上面写着“由于某些中间构造函数调用,没有可用的 sestijanuar8 类型的封闭实例”。我很难理解抽象类和方法,所以任何形式的帮助都将不胜感激!

【问题讨论】:

  • 我认为这两个类和您的主要方法都在您省略发布的另一个类中。请发帖minimal reproducible example
  • 我建议初学者每个文件一节课。它可以帮助您专注于主要概念。
  • 是的,它们是,但我对复制粘贴整个代码犹豫不决。对于这篇长篇文章,我深表歉意,我是新手,我仍然了解在 StackOverflow 上发帖的工作原理。
  • 我阅读了它并找到了有用的信息。再次感谢您帮助我!

标签: java inheritance abstract super


【解决方案1】:

您的类在另一个类中,它们不是静态的,所以它们是内部类。这意味着它们只能通过引用包含类的实例来实例化。

要么将它们移出包含类,要么声明它们static。然后你就可以实例化它们了。

【讨论】:

    【解决方案2】:

    由于您的错误消息“没有可访问的封闭类型实例”,我可以推断您的所有代码都在封闭类中,这是有道理的,因为否则您的 main 方法不在一个类中,这不允许。

    SpecialColorYellow 两个类设为静态。如果你不这样做,那么该类是封闭类的特定instance 中的一个,而你没有它,因为你在main 中,这是一个静态方法。

    如果您创建了一个类 static 而没有创建另一个类,那么您仍然会遇到同样的问题,只是可能在不同的位置。

    您所写的任何内容都没有表明封闭类实例对于您的类的操作是必需的,因此只需将它们都设为static,这样它们就不会依赖于封闭类的实例,您没有使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2012-11-17
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多