【问题标题】:Could someone clarify why the firstname is being printed as null in the below code?有人可以澄清为什么在下面的代码中名字被打印为 null 吗?
【发布时间】:2021-10-04 17:38:34
【问题描述】:

由于它是一个非静态变量,我试图了解我们应该如何在静态和非静态方法中调用这个类变量。

代码:

public class Person {
    String firstName;

public static void main(String[] args) {
        Person pps = new Person();
        pps.setFirstName("Surendra");
        System.out.println(getFirstName());
}

public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

public static String getFirstName() {
        Person pps = new Person();
        return pps.firstName;
    }

}

【问题讨论】:

  • 您正在从main 方法中调用静态方法getFirstName()。这两种方法都在为你的类创建单独的实例,那么有什么令人惊讶的呢?
  • 重读 OOP 的基础知识。像这样guru99.com/java-oops-concept.html

标签: java static-methods non-static


【解决方案1】:

如果没有以某种方式提供实例(例如,作为参数,或在本地创建),就无法从静态方法访问非静态数据成员。静态方法不会自然地附加到类的任何实例上,因此方法中没有this

要从特定实例访问数据成员,您需要在特定实例上调用非静态方法。

public String getFirstName() {
    return this.firstName;
}

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(pps.getFirstName());
}

如果您希望在类的所有实例之间共享相同的名字,那么一切都应该是静态的:

public class Person {

    static String firstName;

    public static void main(String[] args) {
        Person.setFirstName("Surendra");
        System.out.println(Person.getFirstName());
    }

    public static void setFirstName(String newFirstName) {
        firstName = newFirstName;
    }

    public static String getFirstName() {
        return firstName;
    }

}

【讨论】:

  • @user16320675 我编辑了措辞。你满意吗?
  • @rkechols,感谢您的解释。我已经将类级别的类对象声明为静态对象。这也解决了问题,保持方法为静态。
【解决方案2】:

问题是您在 getter 中创建了一个新的 Person ,这使得您以前在 Main 方法中的代码无关紧要,因为您正在查询从未设置过的第二个 Person 的名字。由于您的静态方法无法访问实例,因此您需要传入实例。

如果你想要一个静态方法返回一个实例变量,你的代码应该是这样的 -

public static String getFirstName(Person pps) {
        return pps.firstName;
    }

public static void main(String[] args) {
    Person pps = new Person();
    pps.setFirstName("Surendra");
    System.out.println(Person.getFirstName(pps));
}

PS- rkeckol 的回答是正确的,关于您通常应该如何设置/获取变量,但在我看来,您是有目的地尝试使用跨静态/成员方法。如果我误解了,请按照他的回答来代替

PPS - 也是您的主要方法在其自己的类中的最佳实践。

【讨论】:

    【解决方案3】:

    静态变量在类内声明,可以在类外使用类名和类对象。但是类名是首选。

    非静态变量不能在静态块或静态方法中使用,但静态变量可以在非静态和静态方法中使用。

    所以,要么 'firstName' 作为静态变量。或将 getFirstName 设为非静态方法,如下所示。

         String firstName;
    
    public static void main(String[] args) {
        StackOverFlowTesting pps = new StackOverFlowTesting();
            pps.setFirstName("Surendra");
            System.out.println(pps.getFirstName());
    }
    public  String getFirstName() {
        //StackOverFlowTesting pps = new StackOverFlowTesting();
            return this.firstName;
        }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    

    【讨论】:

      【解决方案4】:

      尝试从 getFirstName 中删除 Static 部分,然后更改 println 以从创建的 Person 对象中调用 getFirstName 方法。

      public class Person {
              String firstName;
          
          public static void main(String[] args) {
                  Person pps = new Person();
                  pps.setFirstName("Surendra");
                  System.out.println(pps.getFirstName());
          }
          
          public void setFirstName(String firstName) {
                  this.firstName = firstName;
              }
          
          public String getFirstName() {
                  Person pps = new Person();
                  return pps.firstName;
              }
          
          }
      

      【讨论】:

      • 这仍然返回 null,因为 getFirstName 仍然创建 Person 的新实例而不调用 setFirstName。
      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2020-12-20
      相关资源
      最近更新 更多