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



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

这是我的代码:

public class User {

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

User student = new User();
student.name = "Jack";
}

首先,我想打开我的答案,说你不能在User类中递归声明User的实例,因为当创建新的User时,这会溢出堆栈。事实上,User的创建将触发另一个的创建,该创建又将生成另一个User等等,从而导致User实例化的无尽链。这是一个逻辑错误。

此外,您的IDE可能会向您发出另一个关于语句的语法错误:

student.name = "Jack";

尽管在逻辑上不正确,但在语法上允许您在User类中声明User,就像您在这里所做的一样

User student = new User();

这将被解释为User类的一个属性。但是,您不能在块之外编写任何逻辑。如果您想将名称";Jack";对于你的学生变量,你有三个选项:

  1. 定义一个接受名称的构造函数,并在实例化过程中将值Jack传递给学生实例
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
//Let's pretend this is fine
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;
//Let's pretend this is fine
User student = new User();
{
student.name = "Jack";
}
}
  1. 初始化类构造函数中的学生字段
public class User {
public String name;
public String surname;
public int age;
public static String companyname;
//Let's pretend this is fine
User student = new User();
public User(){
this.student.name = "Jack";
}
}

然而,所有这些选项都没有什么意义,它们都是为了让你理解你可以写声明的上下文。

我假设您只是想定义一个具有实际字段(namesurnameagecompanyname)的User,然后在";测试";上下文,就像一个主方法一样,用来测试你的类。这很可能是你试图做的:

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);
}
}

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

无封装

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/

最新更新