为什么我不能在 Java 中的本地 class 中声明对象?

Why can't I declare object in my local class in Java?

我最近开始学习编程。我知道它看起来毫无意义,但我想知道为什么我不能在本地 class 中声明我的对象。我可以在我创建的第二个 class 中声明它,但不能在主要的

中声明

这是我的代码:

public class User {
    
 public String name;
 public String surname;
 public int age;
 public static String companyname;
 
 User student = new User();
 student.name = "Jack";
}

你的 IDE 给你的错误,是关于你的陈述

student.name = "Jack";

您可以声明一个 User,就像您在此处所做的那样

User student = new User();

它将被解释为您的 User class 的属性。但是,您不能在方法之外编写任何逻辑。您只能声明字段以定义 class' 属性。如果你想将名字 Jack 分配给你的学生变量,你有三个选择:

  1. 定义一个接受名称的构造函数,并在实例化期间将值 Jack 传递给您的学生实例。
public class User {

    public String name;
    public String surname;
    public int age;
    public static String companyname;
    User student = new User("Jack");
    
    public User(String name){
        this.name = name;
    }
}
  1. 在实例块中包含您的语句。
public class User {

    public String name;
    public String surname;
    public int age;
    public static String companyname;
    User student = new User();
    {
        student.name = "Jack";
    }
}
  1. 在 class 构造函数中初始化您的学生字段。
public class User {

    public String name;
    public String surname;
    public int age;
    public static String companyname;
    User student = new User();

    public User(){
        this.student.name = "Jack";
    }
}

但是,所有这些选项都没有什么意义,它们都是为了让您了解可以编写此类语句的上下文。此外,正如评论中所报告的那样,在你的 User class 中创建一个新的 User 将在每次创建新的 User 时溢出堆栈,因为每个用户的创建触发创建另一个。

我想您只是想定义一个 User 及其实际字段(姓名、姓氏、年龄、公司名称),然后在“测试”上下文中声明一个 Student,就像 main 方法一样。这很可能是您尝试执行的操作:

public class User {

    public String name;
    public String surname;
    public int age;
    
    public static String companyname;

    public User(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public static void main(String[] args) {
        User student = new User("Jack", "Black", 15);
    }
}

附带说明一下,您应该将 class 的属性(其字段)定义为 privatepublic 访问修饰符通常用于对象(其方法)提供的服务。这也称为 information hidingencapsulation。基本上,您想隐藏 class 的内部实现并保护其状态(其字段)免受任何滥用,例如分配不一致的值。您的方法是调节对内部状态的访问的“外层”,它们包含防止误用和对对象状态进行不一致更改的逻辑。

无封装

public class User {

    public String name;
    public String surname;
    public int age;
   
    public User(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public static void main(String[] args) {
        User student = new User("Jack", "Black", 15);
        
        //misuse of the object's attributes
        student.age = -20;
    }
}

封装

public class User {

    private String name;
    private String surname;
    private int age;

    public User(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 120) {
            return;
        }
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public static void main(String[] args) {
        User student = new User("Jack", "Black", 15);

        student.age = -20; //gives you an error, you cannot access anymore this field directly

        student.setAge(-20); //It won't update its age to -20
        System.out.println(student.getAge()); //It still prints 15

        student.setAge(25); //Regulates the update and allows the assignment
        System.out.println(student.getAge()); //Prints 25
    }
}

这篇文章很好地解释了封装的概念:

https://www.geeksforgeeks.org/encapsulation-in-java/