为什么我在输出中保持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;
}
}
答案 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;
}
}