【问题标题】:System.out.println(dog1.getName()); returning null [duplicate]System.out.println(dog1.getName());返回 null [重复]
【发布时间】:2020-02-05 21:56:37
【问题描述】:

dog1.setName("rex") 没有将值 "rex" 分配给 name,而是 返回null为什么会这样?

public class Program3a {
    private  String name;

    public  String getName() {
        return name;
    }      

    public void setName(String name) {
        name = "unassigned";
    }
}

public class Program3aTest extends Program3a{
    public static void main(String[]args) {
        Program3aTest dog1 = new Program3aTest();
        dog1.setName("rex");

        System.out.println(dog1.getName());

    }
}

【问题讨论】:

  • name = "unassigned"; 应该是 this.name = "unassigned";。否则你修改的是参数而不是类字段。
  • 即使那样,名字也永远不会是"rex"
  • 好的,所以我将 name = "unassigned" 更改为 this.name = "unassigned";现在它返回未分配而不是 null,但仍然不是 rex
  • @user12114019 这就是 Arnaud 的意思。在您的setName 中,您将name 设置为= "unassigned"。因此,当您调用它时,它会这样做。
  • 好的,那么我如何获得 rex 的值?因为当我删除 = "unassigned";我收到语法错误插入“赋值运算符表达式”来完成表达式。我该怎么办?

标签: java logic


【解决方案1】:

您在类 Program3a 中设置名称时出错。应该有 this.name = name 而不是 name = "unassigned"。因此,请替换此声明。因为name的初始值默认是构造函数设置的null。您必须将其分配给作为 Program3aTest 类的输入的参数名称。这是显示“rex”的代码。

public class Program3a {
    private  String name;

   /* public Program3a(String name) {
        setName(name);
    }*/

    public  String getName() {
        return name;
    }      

    public void setName(String name) {
        this.name = name;      // change this statement in your code
    }



}

public class Program3aTest extends Program3a{
    public static void main(String[]args) {
        Program3aTest dog1 = new Program3aTest();
        dog1.setName("rex");

        System.out.println(dog1.getName());

    }
}

【讨论】:

    【解决方案2】:

    像这样更改Program3a 类:

    public class Program3a {
        private  String name = "unassigned";
    
        public  String getName() {
            return name;
        }      
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    【讨论】:

      【解决方案3】:

      简而言之,您的“getter”正在返回您给它的变量值 -> 字符串(类型)变量名称 =“未分配”。您将始终告诉它将名为“name”的变量设置为未分配的字符串。试试这个

      public void setName(String name) {
          this.name = name;
      }
      

      此外,您还想创建一个构造函数并使其整体上更高效(构造函数可以摆脱 setter 等等)。 全文:

      public class Main {
          public static void main(String[] args){
      
          Program3a testClass = new Program3a();
      
          testClass.setName("Rex");
              System.out.println(testClass.getName());
          }
      }
      
      public  class Program3a {
          private  String name;
      
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      

      或者更好看的构造函数

      public Program3a(String name) {
          this.name = name;
      }
      

      这当然需要你更新你的测试器类(我使用 main)。

          Program3a testClass = new Program3a("Rex");
      
          System.out.println(testClass.getName());
      

      构造函数被自动创建为幽灵。这被覆盖可以接受变量的参数并减少不需要的编码。创建后,您可以使用Program3a testClass = new Program3a("Rex"); 行来创建一个新类。 Rex 现在自动填充变量 Named 并在调用 testClass.getName() 时继续使用该值,直到更改。

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 2019-10-13
        • 2019-10-04
        • 2011-11-01
        • 2017-05-09
        相关资源
        最近更新 更多