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;
}
}
为什么我总是在输出中得到 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;
}
}