Java 预期输出的值未显示

Java 预期输出的值未显示,java,Java,我实例化了SpaceStation类,并调用了addaudion方法,但在运行它时,名称、重量、高度和宇航员没有显示在我的输出中 SpaceStation.java: public class SpaceStation { //private members private String name; private double stationWeight; private double altitude; private Astronaut[] Astrona

我实例化了SpaceStation类,并调用了
addaudion
方法,但在运行它时,名称、重量、高度和宇航员没有显示在我的输出中

SpaceStation.java:

public class SpaceStation {

   //private members
   private String name;
   private double stationWeight;
   private double altitude;

   private Astronaut[] Astronauts;
   private int totalAstronauts;

   //overloaded constructor
   public SpaceStation(String name, double 
   weight) {
      int altitude = 0;
      int totalAstronauts = 0; 
 }

  //method
  public void addAstronaut(String name, double 
     height, double weight) {
     Astronauts = new Astronaut[3];
     stationWeight = stationWeight + weight;
     totalAstronauts++;  
  }

  public double setAltitude(double altitude) { return this.altitude = altitude; }

  public String toString() {
     return "SpaceStation: " + name + "\n" +
            "Weight(kg): " + stationWeight + "\n" +
            "Altitude(km): " + (altitude) + "\n" +
            "Astronauts: " + (totalAstronauts);
  }

  public static void main(String[] args) {
     SpaceStation aa = new SpaceStation("ISS", 419700.0);
     System.out.println(aa);
     aa.addAstronaut("Eli", 167.64, 81.65);
     aa.addAstronaut("John", 185.43, 100.30);
     aa.addAstronaut("Joey", 175.38, 90.38);
     aa.setAltitude(400.0);
   
  }

 }

您的代码包含四个错误:

1-您没有在构造函数中设置实例变量
name
的内容。这会在打印输出时导致行
SpaceStation:null
。您需要在构造函数中设置名称。将构造函数更改为如下所示:

   public SpaceStation(String name, double 
   weight) {
      this.name = name;    // This line was added
      int altitude = 0;
      int totalAstronauts = 0; 
 }
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;    // Removed "int"
      totalAstronauts = 0;  //Removed "int"
      Astronauts = new Astronaut[3];
 }
package gov.nasa.spacevehicles;

import gov.nasa.personnel.Astronaut;

public class SpaceStation {

   //private members
   private String name;
   private double stationWeight;
   private double altitude;

   private Astronaut[] Astronauts;
   private int totalAstronauts;

   //overloaded constructor
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;
      totalAstronauts = 0; 
      Astronauts = new Astronaut[3];
 }


  //method
  public void addAstronaut(String name, double 
     height, double weight) {
     Astronauts[totalAstronauts] = new Astronaut(name, height, weight);
     stationWeight = stationWeight + weight;
     totalAstronauts++;  
  }

  public double setAltitude(double altitude) { return this.altitude = altitude; }

  public String toString() {
     return "SpaceStation: " + name + "\n" +
            "Weight(kg): " + stationWeight + "\n" +
            "Altitude(km): " + (altitude) + "\n" +
            "Astronauts: " + (totalAstronauts);
  }

  public static void main(String[] args) {
     SpaceStation ss = new SpaceStation("ISS", 419700.0);
     
     ss.addAstronaut("Smith", 167.64, 81.65);
     ss.addAstronaut("John", 185.43, 100.30);
     ss.addAstronaut("Joey", 175.38, 90.38);
     ss.setAltitude(400.0);
     
     System.out.println(ss);
   
  }

 }
2-在添加宇航员和设置高度之前,您正在打印
ss
的内容。当时没有增加航天员,所以重量,航天员人数,高度都是0是正常的。如果在完成这些操作后打印空间站的内容,它将正常工作:

  public static void main(String[] args) {
     SpaceStation ss = new SpaceStation("ISS", 419700.0);
     
     ss.addAstronaut("Smith", 167.64, 81.65);
     ss.addAstronaut("John", 185.43, 100.30);
     ss.addAstronaut("Joey", 175.38, 90.38);
     ss.setAltitude(400.0);
     
     System.out.println(ss);    // This line was moved after the addAstronaut and setAltitude methods.
   
  }
3-正如@sagi标记的那样,在构造函数中,您正在声明和初始化另一个变量,而不是在类中,但名称相同。从技术上讲,double和integer已经用0.0初始化,因此您不会真正注意到它,但是构造函数中的变量
aighty
totalSpautors
实际上是无用的。建议如下更新构造函数:

   public SpaceStation(String name, double 
   weight) {
      this.name = name;    // This line was added
      int altitude = 0;
      int totalAstronauts = 0; 
 }
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;    // Removed "int"
      totalAstronauts = 0;  //Removed "int"
      Astronauts = new Astronaut[3];
 }
package gov.nasa.spacevehicles;

import gov.nasa.personnel.Astronaut;

public class SpaceStation {

   //private members
   private String name;
   private double stationWeight;
   private double altitude;

   private Astronaut[] Astronauts;
   private int totalAstronauts;

   //overloaded constructor
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;
      totalAstronauts = 0; 
      Astronauts = new Astronaut[3];
 }


  //method
  public void addAstronaut(String name, double 
     height, double weight) {
     Astronauts[totalAstronauts] = new Astronaut(name, height, weight);
     stationWeight = stationWeight + weight;
     totalAstronauts++;  
  }

  public double setAltitude(double altitude) { return this.altitude = altitude; }

  public String toString() {
     return "SpaceStation: " + name + "\n" +
            "Weight(kg): " + stationWeight + "\n" +
            "Altitude(km): " + (altitude) + "\n" +
            "Astronauts: " + (totalAstronauts);
  }

  public static void main(String[] args) {
     SpaceStation ss = new SpaceStation("ISS", 419700.0);
     
     ss.addAstronaut("Smith", 167.64, 81.65);
     ss.addAstronaut("John", 185.43, 100.30);
     ss.addAstronaut("Joey", 175.38, 90.38);
     ss.setAltitude(400.0);
     
     System.out.println(ss);
   
  }

 }
4-当@sagi标记时,每次添加宇航员时,您都在初始化
宇航员
数组。你需要在构造器中初始化它一次,大概每次你添加一个时都会在数组中设置宇航员

有了所有这些注释,
空间站
类应该如下所示:

   public SpaceStation(String name, double 
   weight) {
      this.name = name;    // This line was added
      int altitude = 0;
      int totalAstronauts = 0; 
 }
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;    // Removed "int"
      totalAstronauts = 0;  //Removed "int"
      Astronauts = new Astronaut[3];
 }
package gov.nasa.spacevehicles;

import gov.nasa.personnel.Astronaut;

public class SpaceStation {

   //private members
   private String name;
   private double stationWeight;
   private double altitude;

   private Astronaut[] Astronauts;
   private int totalAstronauts;

   //overloaded constructor
   public SpaceStation(String name, double 
   weight) {
      this.name = name;
      altitude = 0;
      totalAstronauts = 0; 
      Astronauts = new Astronaut[3];
 }


  //method
  public void addAstronaut(String name, double 
     height, double weight) {
     Astronauts[totalAstronauts] = new Astronaut(name, height, weight);
     stationWeight = stationWeight + weight;
     totalAstronauts++;  
  }

  public double setAltitude(double altitude) { return this.altitude = altitude; }

  public String toString() {
     return "SpaceStation: " + name + "\n" +
            "Weight(kg): " + stationWeight + "\n" +
            "Altitude(km): " + (altitude) + "\n" +
            "Astronauts: " + (totalAstronauts);
  }

  public static void main(String[] args) {
     SpaceStation ss = new SpaceStation("ISS", 419700.0);
     
     ss.addAstronaut("Smith", 167.64, 81.65);
     ss.addAstronaut("John", 185.43, 100.30);
     ss.addAstronaut("Joey", 175.38, 90.38);
     ss.setAltitude(400.0);
     
     System.out.println(ss);
   
  }

 }
(1) SpaceStation的构造函数不会将传入的名称和权重值设置为SpaceStation对象的参数。将
this.name=name
this.stationWeight=weight
添加到构造函数中。
this
关键字告诉Java,您所引用的变量是调用构造函数的对象的参数

构造函数还创建了名为
altitude
total
的新变量,这些变量仅存在于构造函数内部。要更改调用构造函数的对象的参数值,请向构造函数添加
this.altitude=altitude
this.totalSpators=totalSpators

//重载构造函数
公共空间站(字符串名称,双倍重量){
这个高度=0;
该值为0;
this.name=名称;
此参数。站重=重量;
}
(2) 在对主方法执行操作之前,它会打印
ss
。将其放在主代码中的其他代码之后:

publicstaticvoidmain(字符串[]args){
空间站ss=新空间站(“ISS”,419700.0);
ss.AddSpautor(“史密斯”,167.64,81.65);
ss.AddSpautor(“约翰”,185.43100.30);
党卫军("乔伊",175.38,90.38),;
ss.设定高度(400.0);
系统输出打印LN(ss);
}
(3) 每次调用AddSpauton()时,都会覆盖宇航员数组。通过在AddSpauton()中创建一个新的宇航员实例并将其添加到宇航员数组中来修复此问题。您应该向构造函数添加一行,以将数组初始化为大小为3或更大的空数组,以便在AddSpautor()中有空间添加宇航员对象

//重载构造函数
公共空间站(字符串名称,双倍重量){
这个高度=0;
该值为0;
this.name=名称;
此参数。站重=重量;
//添加这一行
宇航员=新宇航员[10];
}
//方法
公共空间添加宇航员(字符串名称、双倍高度、双倍重量){
//将新的宇航员对象添加到索引处的数组中
宇航员[总宇航员]=新宇航员(姓名、身高、体重);
站位重量=站位重量+重量;
总航天员++;
}

主要有两个错误,显示的
名称为空。
1:您没有在构造函数中设置
name
,这导致
name
的默认值为
null

所以当你说
this.name=name
时,它告诉我我有这个,请查看并设置它的值

//overloaded constructor
       public SpaceStation(String name) {
          this.name = name; // changed
          int altitude = 0;
          Astronauts = new Astronaut[3];
          int totalAstronauts = 0; 
     }
同样在
main
函数中,您试图在设置值之前打印它。 您应该先给出它的值,然后再打印它

public static void main(String[] args) {
     SpaceStation ss = new SpaceStation("ISS", 419700.0);
     
     ss.addAstronaut("Smith", 167.64, 81.65);
     ss.addAstronaut("John", 185.43, 100.30);
     ss.addAstronaut("Joey", 175.38, 90.38);
     ss.setAltitude(400.0);
     
     System.out.println(ss); // changed
   
  }
此外,我看到您制作了一个
宇航员[]宇航员
阵列,但从未在其中添加任何宇航员。那么它的全部意义是什么呢? 添加宇航员时,它只存储
宇航员的总数
,而不存储实际的
宇航员对象

   //method
      public void addAstronaut(String name, double 
         height, double weight, Astronaut object) {
          Astronauts[totalAstronauts] = object; // changed
         stationWeight = stationWeight + weight;
         totalAstronauts++;  
      }
主要内容:

航天员级别:

public class Astronaut {
     //private fields
       private String name;
       private double height;
       private double weight;

       //defualt constructor
       public Astronaut() { }

       //overloaded constructor
      public Astronaut (String name, double height, double weight) {
         this.name = name;
         this.height = height;
         this.weight = weight;
     } 
      
        // Added 
      public String toString() {
          return "\nAstronaut Name: "+name+"\n"+name+" Height: "+height+"\n"+name+" Weight: "+weight;
      } 

}
输出:

SpaceStation: ISS
Weight(kg): 272.33
Altitude(km): 400.0
Astronauts: 3

Astronaut Name: Smith
Smith Height: 167.64
Smith Weight: 81.65

Astronaut Name: John
John Height: 185.43
John Weight: 100.3

Astronaut Name: Joey
Joey Height: 175.38
Joey Weight: 90.38

你知道你每次添加宇航员时都会覆盖宇航员数组吗?那么每次他添加宇航员时都会覆盖宇航员数组呢?另外-在构造函数上,他是在初始化局部变量,而不是类变量,我想这是个错误。@sagi说得对。这不是问题的目的,但我猜这仍然是一个bug。更新了答案。感谢您对我的问题的意见。我明白我做错了什么。谢谢你指出这个.stationWeight和这个.name。我发誓是这样的小东西让我抓狂。