Java printf()的输出错误
为什么我的输出一直是0.0000?我在这里放了一些代码,它是主类,一个子类FragGrenade和父类-Explosive。我一直从public void explode()方法中得到0.0000,我想我在printf()中做的是smth错误。有人能帮我吗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);
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 classExplosive
设置此字段的值
你可能应该把你的课程改成
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;
}
}