Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java printf()的输出错误_Java_Inheritance_Printf - Fatal编程技术网

Java printf()的输出错误

Java printf()的输出错误,java,inheritance,printf,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);

为什么我的输出一直是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;
    }

}

您定义了完全相同的变量
受保护的双blastRadiusMeters。当这种情况发生时,子类会隐藏超类,这意味着访问
this.blastRadiusMeters
将访问FragGrenade中从未设置过的超类

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

public class FragGrenade extends Explosive{

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

在派生类中声明了另一个

protected double blastRadiusMeters;
但是在构造器中通过

public FragGrenade(double blastRadiusMeters) {
    super(blastRadiusMeters);//here
}
您正在从super class
Explosive
设置此字段的值

你可能应该把你的课程改成

public class FragGrenade extends Explosive {

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

}
只需使用继承自
Explosive
类的方法版本


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

%.2-您的意思是%f吗?但是子方法是否覆盖父方法@巴里斯19。这仍然会给我0.000这里有更多的信息来帮助你理解:你是对的@Zach Sadler。但是我还有另一个子类,它在构造函数中有不同的变量,我在下面描述过。@Nikola Nuke工作的原因是因为你使用了不同的变量名--
BlastAreaKymes
而不是
blastRadiusMeters
谢谢,@Pshemo!最后一个问题:为什么我在这一行的另一个子类中得到一个错误:System.out.printf(“Boom:blast radius%f km\n”,this.blastArea km*1000);。。。。但当我换成爆炸半径计时,它会给我结果?@Nikola你得到了什么错误?根据您的示例判断,我怀疑这可能与您试图将
this.blastArea km
(您可能没有)乘以1000,而不是
this.blastRadiusMeters
有关。再次感谢您,我正在为如何在子类中访问父类的受保护变量而苦苦挣扎class@Nikola然后在父类中将变量
设为private
,这样它就只能由该类访问。您可以在其内部添加
public
protected
方法
double-getBlastRadiusMeters(){return-blastRadiusMeters;}
,这样派生类将能够从其超类内部获取值,但无法更改它。@非常感谢,@Pshemo!
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;
    }

}