我最近开始学习编程。我知道它可能看起来毫无意义,但我想知道为什么我不能在本地类中声明我的对象。我可以在创建的第二个类中声明它,但不能在主类中声明。
这是我的代码:
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";对于你的学生变量,你有三个选项:
- 定义一个接受名称的构造函数,并在实例化过程中将值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;
}
}
- 在实例块中包含您的语句
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";
}
}
- 初始化类构造函数中的学生字段
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";
}
}
然而,所有这些选项都没有什么意义,它们都是为了让你理解你可以写声明的上下文。
我假设您只是想定义一个具有实际字段(name
、surname
、age
和companyname
)的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);
}
}
附带说明一下,您应该将类的属性(其字段)定义为private
。public
访问修饰符通常用于对象(其方法)提供的服务。这也被称为information hiding
或encapsulation
。基本上,您希望隐藏类的内部实现,并保护其状态(字段)免受任何滥用,例如分配不一致的值。你的方法是";外层";为了规范对内部状态的访问,它们包含防止误用和对对象状态的不一致更改的逻辑。
无封装
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/