printf() 输出错误

Wrong output with printf()

为什么我总是在输出中得到 0.0000?我在这里放了一些主要的代码 class,子 classes FragGrenade 和父 class -Explosive 之一。我一直从 public void explode() 方法中得到 0.0000,我猜我用 printf() 做错了。有人可以帮我吗?

public class ExplosiveDemo{

    public static void main(String args[]){

        Explosive frag = new FragGrenade(15.5);

        System.out.println( frag.isRadioactive() ); 
        // false
        frag.explode();
        System.out.println();
        // OUTPUT:
        // Boom: blast radius 15.50 meters

        Explosive nuke = new Nuke(3.2);
        System.out.println(nuke.isRadioactive() ); 
        // true
        nuke.explode();
        // OUTPUT:
        // Boom: blast radius 3200.00 meters
        // Area irradiated
  }
public class FragGrenade extends Explosive{

    protected double blastRadiusMeters;

    public FragGrenade(double blastRadiusMeters)
    {
        super(blastRadiusMeters);
    }

    public void explode()
    {
        System.out.printf("Boom: blast radius %f meters\n", this.blastRadiusMeters);
    }
    public boolean isRadioactive()
    {
        return false;
    }


}

}


public abstract class Explosive {

    protected double blastRadiusMeters;

    public Explosive(double blastRadiusMeters)
    {
        this.blastRadiusMeters = blastRadiusMeters;
    }

    public void explode()
    {
        System.out.printf("Boom: blast radius %.2 meters\n", this.blastRadiusMeters);
    }
    public boolean isRadioactive()
    {
        return false;
    }

}

您在子类和超类中定义了完全相同的变量 protected double blastRadiusMeters;。发生这种情况时,子类隐藏超类,这意味着访问 this.blastRadiusMeters 将访问 FragGrenade 中的那个,它从未被设置过。

尝试从子类中删除除构造函数之外的所有内容

public class FragGrenade extends Explosive{

    public FragGrenade(double blastRadiusMeters)
    {
        super(blastRadiusMeters);
    }
}

在派生中 class 你声明了另一个

protected double blastRadiusMeters;

但在构造函数中通过

public FragGrenade(double blastRadiusMeters) {
    super(blastRadiusMeters);//here
}

您正在从超级 class Explosive.

设置该字段的值

您可能应该将 classes 更改为

public class FragGrenade extends Explosive {

    public FragGrenade(double blastRadiusMeters) {
        super(blastRadiusMeters);
    }

}

并简单地使用从 Explosive class.

继承的方法

要使其正常工作,您还需要更正 printf 中的 %.2。应该是 %.2f.

public class Nuke extends Explosive {

    protected double blastAreaKilometers;

    public Nuke(double blastAreaKilometers)
    {
        super(blastAreaKilometers);
    }

    public void explode()
    {
        System.out.printf("Boom: blast radius %f kilometers\n", this.blastAreaKilometers * 1000);
    }
    public boolean isRadioactive()
    {
        return true;
    }

}