printf()的输出错误

时间:2015-02-26 15:15:22

标签: java inheritance printf

为什么我在输出中保持0.0000?我在这里放了一些代码,它们是主类,其中一个是子类FragGrenade,另一个是父类-Explosive。我一直从方法public void explode()得到0.0000,我想我用printf()做了smth错误。有人可以帮我吗?

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

}

3 个答案:

答案 0 :(得分:0)

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

尝试从子类除去构造函数

之外的所有内容
public class FragGrenade extends Explosive{

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

答案 1 :(得分:0)

在派生类中,您声明了另一个

protected double blastRadiusMeters;

但是在构造函数中通过

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

您要从超类Explosive设置此字段的值。

您应该将课程更改为

public class FragGrenade extends Explosive {

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

}

并简单地使用Explosive类的方法的继承版本。

要使其有效,您还需要更正%.2中的printf。它应该是%.2f

答案 2 :(得分:0)

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

}